分组背包

有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组物品中最优的解。

 

分组背包

上一篇:个人封装的php对微信的一些方法 原生


下一篇:9.18碎碎念