动态规划背包问题(转移方程)
dp[i][j] 代表前i件物品,装入背包,总重量不超过j的解法
c数组中存放的是重量,w数组中存放的是价值。
V是背包的总承重。
- 01背包:
\(dp[j] = max(dp[j - c[i]] + w[i], dp[j]);\)
代码模板:
for (int i = 1; i <= n; i++)
for (int j = v; j >= c[i]; j--) {
dp[j] = max(dp[j - c[i]] + w[i], dp[j]);
}
- 多重背包:
\(dp[j] = max(dp[j - c[i] * k] + w[i] * k, dp[j]);\)
代码模板:
for (int i = 1; i <= N; i++) {
for (int j = V; j >= 0; j--) {
for (int k = 1; k <= n[i]; k++) {
if (j >= c[i] * k) {
dp[j] = max(dp[j - c[i] * k] + w[i] * k, dp[j]);
}
}
}
}
- 完全背包:
\(dp[j] = max(dp[j - c[i]] + w[i], dp[j]);\)
代码模板:
for (int i = 1; i <= n; i++) {
for (int j = c[i]; j <= v; j++) {
dp[j] = max(dp[j - c[i]] + w[i], dp[j]);
}
}
Copyright littlefrog(2019)
所有权利保留。