codeforces 148E Porcelain 多重背包

题意:公主很生气,要扔瓷罐子。罐子架分n层,每次只能拿两边的罐子扔。每个罐子的价值不同,问最大损失。

做法:背包问题,物品就是每一层,容量就是发火次数。

#include<stdio.h>
#define LMT 10005
int get[103][103],s[103],rget[103][103];
int dp[103][LMT];
int main(void)
{
    int n,m;
    scanf("%d%d",&n,&m);
    int i=3;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
        for(int j=1;j<=s[i];j++)
        {
            scanf("%d",&get[i][j]);
            get[i][j]+=get[i][j-1];
        }
    }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=s[i];j++)
        for(int k=0;k<=j;k++)//暴力枚举在某个架子上扔n次的最大损失
          if(rget[i][j]<get[i][k]+get[i][s[i]]-get[i][s[i]-j+k])
           rget[i][j]=get[i][k]+get[i][s[i]]-get[i][s[i]-j+k];
    for(int i=1;i<=n;i++)
      for(int j=m;j>=0;j--)
        for(int k=0;k<=s[i]&&k<=j;k++)
        if(dp[i][j]<dp[i-1][j-k]+rget[i][k])
        dp[i][j]=dp[i-1][j-k]+rget[i][k];
        printf("%d\n",dp[n][m]);
}


你可能感兴趣的:(codeforces 148E Porcelain 多重背包)