Consumer (有依赖的背包)

题目大意:

给你一些物品,每个物品有自己的花费和价值,每个物品 都有相对应的箱子, 如果你想要买这个物品,你就需要先买这个箱子(依赖),求 n个箱子花费 t 能获得的最大价值

思路:

dp[i][j]  代表在 i 个箱子花费 j 能获得的最大价值

我们需要优先对箱子进行处理,处理完之后其他的都和 01背包一样了 

具体的看代码注释吧

int dp[55][100010];
int n,t,box,num;
int main ()
{
    int i,j,k;
    while(scanf("%d %d",&n,&t)!=EOF)
    {
         memset(dp,0,sizeof(dp));//初始化背包
        for(i=1;i<=n;i++)
        {
            scanf("%d %d",&box,&num);
            for (int j=0; j<=box;j++) //对盒子的处理(即依赖)
                dp[i][j] = -1;
            for(k=t;k>=box;k--)
                dp[i][k]=dp[i-1][k-box]; //先让每组数据拿到上组的状态

           //下列操作先算出我需要该组物品(盒子)
            for(j=0;j<num;j++)
            {
                int c,w;
                scanf("%d %d",&c,&w);
                for(k=t;k>=c;k--)
                {
                    if(dp[i][k-c]!=-1)
                        dp[i][k]=max(dp[i][k],dp[i][k-c]+w);
                }
            }
            //取和不取的比较算出最大价值
            for(j=0;j<=t;j++)
            {
                dp[i][j]=max(dp[i-1][j],dp[i][j]);
            }
        }
        printf("%d\n",dp[n][t]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-Ackerman/p/12264623.html