动态规划背包问题(转移方程)

dp[i][j] 代表前i件物品,装入背包,总重量不超过j的解法
c数组中存放的是重量,w数组中存放的是价值。
V是背包的总承重。


  1. 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]);
    }
  1. 多重背包:
    \(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]);
            }
        }
    }
}
  1. 完全背包:
    \(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]);
    }
}
posted @ 2019-12-01 15:39  littlefrog  阅读(457)  评论(0编辑  收藏  举报