01背包
设 (dp[i][j]) 为处理完前 i 个物品,背包使用容量为 j 的最大价值。
for(int i = 1; i <= n; ++i) {
for(int j = w[i]; j <= W; ++j)
dp[i][j] = max(dp[i][j], dp[i - 1][j - w[i]] + v[i]);
}
可以用滚动数组
for(int i = 1; i <= n; ++i) {
int t = i & 1;
for(int j = w[i]; j <= W; ++j)
dp[t][j] = max(dp[t][j], dp[1 - t][j - w[i]] + v[i]);
}
可以把滚动也省略了。
for(int i = 1; i <= n; ++i) {
for(int j = W; j >= w[i]; --j)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
}
完全背包
for(int i = 1; i <= n; ++i) {
for(int j = w[i]; j <= W; ++j)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
}
多重背包
二进制分组优化
单调队列优化