DP:完全背包

潘CSP400班

2024-02-12 17:13:24
2024-03-12 17:13:24

信息与公告

完全背包模板:先掌握模板思路,然后多练习消化,最后不需要模板

int dp[1002][1002];
int w[1002];  //重量
int v[1002];  //价值

int main() {
    int n, t;
    cin >> n >> t;  // 物品数n,背包最大承重t
    for (int i = 1; i <= n; i++) {
        cin >> w[i] >> v[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= t; j++) {
            dp[i][j] = dp[i - 1][j];
            for (int k = 1; k <= j / w[i]; k++) {     // 第 i 个物品可以选择 k 次(这个for可优化)
                if (j >= k * w[i])
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - k * w[i]] + k * v[i]);
            }
        }
    }
    cout << dp[n][t];
    return 0;
}

优化:第3层的for可优化为

            if(j >= w[i])                     
                dp[i][j] = max(dp[i][j], dp[i][j - w[i]] + v[i]);    

区别:优化后,完全背包和01背包的代码非常相似,仅一点差别:

  • 01背包是:dp[i-1][j - w[i]] + v[i]
  • 完全背包是:dp[i][j - w[i]] + v[i]