阅读 67

分组背包

有n件物品,背包总重量为V,其中物品被分成了k组,同一组中的物品最多只能选一件。

选出一些物品使得背包中物品总价值最大。

 

核心代码:

for(int k=1;k<=1000;k++){  //k组 
        for(int j=V;j>=0;j--){  //求出在相同重量下 考虑第k组后最大的价值 
            for(int i=0;i//确保只选了第k组中的至多一件物品 
                if(j>=w[vv[k][i]]){
                    dp[j]=max(dp[j],dp[j-w[vv[k][i]]]+v[vv[k][i]]);
                }
            }
        }
    }
    cout<

这么写先枚举了当前背包的总重量j,再用i表示第k组中的第几件物品,这样可保证每组中最多选一件物品,且选这件物品是当前重量下、考虑了前k组物品中最优的解。

 

原文:https://www.cnblogs.com/re0acm/p/15310860.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐