第七单元 背包专题
这个整理了好久,求谅解,谢谢
7.1 部分背包问题
参见 “4.1 装载问题”。部分背包问题是贪心算法问题,其他背包问题都是动态规划问题。
7.2 0/1 背包问题!
【问题描述】有 n 件物品和一个容量为 C 的背包。第 i 件物品的重量是 w[i],价值是 v[i]。求解将哪些物品
装入背包可使价值总和最大。
(1) 二维数组表示
1. 定义状态:f[i][c]表示前 i 件物品恰放入一个容量为 c 的背包可以获得的最大价值。
2. 状态转移方程:
// 注意边界处理
for (int i=1;i<=n;i++)
for (int c=0;c<=C;c++)
{
f[i][c]=f[i-1][c];
if (c>=w[i]) f[i][c] = max(f[i][c], f[i-1][c-w[i]] + v[i]);
}
时间复杂度、空间复杂度:都是 O(NC)
(2) 一维数组表示
1. 定义状态:由于递推的过程和雪天环形路上的扫雪车类似,所以可以把 i 省略。
2. 状态转移方程:
递推时