Consumer (有依赖的背包)

Posted -ackerman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",dp[n][t]);
    }
    return 0;
}

 

以上是关于Consumer (有依赖的背包)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 3449 有依赖性的01背包

Consumer

HDU3449 Consumer

kafkaThe group member needs to have a valid member id before actually entering a consumer group(代码片段

hdu_3449(有依赖背包)

编程求解:为啥依赖背包进行01背包之后,就可以用分组背包来解决了?