【动态规划】背包

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]);
}

多重背包

二进制分组优化

单调队列优化

二维费用背包

分组背包

有依赖背包

原文地址:https://www.cnblogs.com/purinliang/p/14333581.html