P1757 通天之分组背包
自 01背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 背包,
他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。
1. 动态规划
分组背包
int maxval(int v,vector<int>&c,vector<int>&w,vector<int>&group){
int n = c.size();
vector<int> dp(v+1);
vector<int> idxs[101];//对应组别的索引
for(int i=0;i<n;i++)
idxs[group[i]].push_back(i);
int res = 0;
for(int i=0;i<101;i++){//遍历组
if(idxs[i].size()==0) continue;
for(int j=v;j>=0;j--){
for(auto idx:idxs[i]){//遍历组内物品
if(j>=c[idx])
dp[j] = max(dp[j],dp[j-c[idx]]+w[idx]);
}
res = max(res,dp[j]);
}
}
return res;
}