背包学习小记(1)
01背包
有N件物品,容量为V的背包。第 i 件物品的费用是c[i] ,价值是w[i] 。求能放入背包的物品的最大价值。
每件物品可以选择放或不放,定义f[i][v]表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。
f[ i ][ v ] = max{f[ i-1 ][ v ] , f[ i-1 ][ v-c[i] ]+w[i]}
时间和空间复杂度都是 O(VN)。
优化空间复杂度
肯定有一个主循环 i=1...N,每次算出来二维数组f[i][0...V]的所有值。
令f[v] = f[i][v]
f[i][v] 是由 f[i-1][v] 和f[i-1][v-c[i]]两个子问题推来,每次在主循环中,我们以v=V...0的顺序推f[v],这样才能保证推f[v]是,f[v-c[i]]保存的是f[i-1][v-c[i]]的值,伪代码如下:
for i = 1...N
for v = V...0
f[v] = max{f[v],f[v-c[i]]+w[i]};
初始化的细节问题
如果要求恰好装满背包,初始化时,f[0]为0,其余为-∞。如果不要求恰好装满背包,全部初始化为0。
完全背包