完全背包模板:先掌握模板思路,然后多练习消化,最后不需要模板
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]