物品种类分组,每组有不同种类的物品,每个组只能选一种
- 水果
- 苹果
- 香蕉
- 蔬菜
- 土豆
- 香菜
一样的,dp[i][j]
表示前 i 组,背包空间 j,还是会分为这组我选不选?我选了的话选组里的哪个?
朴素版本就是 dp[i][j] = max(dp[i-1][j], ... , dp[i-1][j-v[i][k]]+w[i][k], ... )
参考 多重背包,组里的哪个可以通过二进制表示,
朴素
直接写一维的朴素
for(int i = 1; i <= n; ++i) {
for(int j = m; j >= 0; --j) { // 因为二维情况要的是前一层
for(int k = 1; k <= s[i]; ++k) {
if(j >= v[i][k]) dp[j] = max(dp[j], dp[j-v[i][k]]+w[i][k]);
}
}
}
(⬆️ 我自己尝试写的,没问题)
ok 啊,最后没有优化了,分组背包就只有这样了