背包问题--动态规划总结

参考《背包九讲》《解动态规划题的基本思考方式》

一、0-1背包问题

题目

有 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(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到 O(V)。

用一维数组解 01 背包问题

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[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的 f[v-c[i]]就相当于原
来的 f[i-1][v-c[i]]。

初始化的细节问题

1.恰好装满背包时的最优解

在初始化时除了 f[0]为 0 其它f[1..V]均设为-∞,这样就可以保证最终得到的 f[N]是一种恰好装满背包的最优解。

2.没有要求必须把背包装满,只是希望价格尽量大

初始化时应该将f[0..V]全部设为 0。

你可能感兴趣的:(背包问题--动态规划总结)