01背包逆序更新及问题的变化

看这里

当问题变成需要恰好装满背包的时候,初始化dp的时候只要不全部初始化成0.采用dp[0]=0,其他的都设置成负无穷大就可以,因为这样子max(dp[j],dp[j-w]+v)只有取dp[j]的时候才能大于零,代表正好装满。
当问题进一步变化成完全背包问题的时候,只要把双层循环正序更新即可,装满的条件同上。
当问题进一步成为多重背包时,可以考虑二进制优化拆解物品,即假如有5袋w=2,v=2的大米,可以分成1,2,1的数量,即变成了三件物品,然后再对更新过的物品数组进行0,1背包。

scanf("%d%d%d",&p,&h,&k);       //p表示价格,h表示重量,k表示大米袋数。
        while( k-c>0)
        {
            k -= c;
            lis[++index].w = c*p;
            lis[index].v = c*h;
            c *= 2;
        }
        lis[++index].w = p*k;  //补充不足指数的差值
        lis[index].v = h*k;

猜你喜欢

转载自blog.csdn.net/weixin_44617722/article/details/88633955