01背包
liyuanchen2021 · · 个人记录
01 背包
一、概念
01 背包是指:有
二、思路
设
放每种物品时,有三种情况:
-
装不下,
f[i][j]=f[i-1][j] -
放,
f[i][j]=f[i-1][j-w[i]]+p[i] -
不放,
f[i][j]=f[i-1][j]
即:
举例分析
如上表,最终答案为 9。
处理过程及输出代码
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j < w[i]) f[i][j] = f[i-1][j];
else f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+p[i]);
}
}
cout << f[n][m] << endl;
三、优化
按照以上解法,时间复杂度为
思路
设
放每种物品时,有三种情况:
-
装不下,
f[j] 不变 -
放,
f[j]=f[j-w[i]]+p[i] -
不放,
f[j] 不变
即:
值得要注意的是:内层循环必须逆序。
处理过程及输出代码
for (int i = 1; i <= n; i++) {
for (int j = m; j >= w[i]; j--) {
f[j] = max(f[j],f[j-w[i]]+p[i]);
}
}
cout << f[m] << endl;
板子题:AT_dp_d Knapsack 1
四、练习
-
P1049 [NOIP2001 普及组] 装箱问题
-
P1048 [NOIP2005 普及组] 采药
-
P1060 [NOIP2006 普及组] 开心的金明
-
AT_dp_e Knapsack 2