背包问题
约 8 分钟
给定背包容量 ,每件物品有重量 和价值 ,每件只能拿一次,问不超重的前提下价值最大——这就是 01 背包。它是所有 DP 模型里最该背熟的一个,很多题(凑硬币、能否装满、分成两半)都是它的变形。状态定为 :只考虑前 件物品、容量为 时的最大价值。对第 件,就两个选择——不拿,或拿。
for (int i = 1; i <= n; i++)
for (int j = 0; j <= W; j++) {
f[i][j] = f[i-1][j]; // 不拿
if (j >= w[i]) // 装得下才谈拿
f[i][j] = max(f[i][j], f[i-1][j-w[i]] + v[i]);
}
cout << f[n][W];
复杂度 。注意这里 是容量、不是物品数,若 很大(比如 )就不能用这个方法。区分好:"每件拿一次"是 01 背包,"每件可拿无限次"是完全背包,方程只差一点,别记混。
小纸条
每件只能拿一次的叫什么背包?
登录 后可看答案