首页 > 其他 > 详细

分组背包

时间:2021-09-20 20:25:57      阅读:12      评论:0      收藏:0      [点我收藏+]

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

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

 

核心代码:

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

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

 

分组背包

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!