背包九讲以及领悟

来源:互联网 发布:大数据时代的政治机遇 编辑:程序博客网 时间:2024/05/16 17:16

崔添翼先生的背包九讲 http://love-oriented.com/pack/pack2alpha1.pdf

无可否认,背包是DP非常重要的一环,可以说它是许多DP的模型,在题目中建模发现背包,往往问题都会化抽象为具体,问题就可以迎刃而解了。

背包也有很多类型:
1. 01背包
2. 完全背包
3. 多重背包
4. 混合背包
5. 泛化背包
6. 分组背包
7. 背包问题的变形等等

01背包
最经典的背包问题,如果说贪心进阶到DP有界限,我认为就在这里.(初学DP有数字塔,找零等题目,都十分经典,但我认为不如这个背包问题典型)

题目描述 现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?

题目分析:
如果不是事先知道,很容易想到贪心做法:

  1. 按价值排序
  2. 按体积排序
  3. 按价值/体积排序

尤其是第三个,不小心很容易认为它是对的。
比如有物品:第一个体积为4,价值为5,第二,第三个物品一样:体积为3,价值为3。
现在有一个体积为5的背包,如果按比值排序后,就会选出第一个物品,那么就去不了其它的物品了,而我们可以肉眼发现同时取了第二第三间物品明显比选第一件物品更优。因为虽然比值是大了,但空间出现了浪费,所以总价值就变小了。

那么怎么办呢,我们可以分为多阶段决策(也是首次引入这个词,以后很多多阶段决策的题往往可以用DP来写),对于每一个物品的决策我们可以把它分开,就是把之前的最优决策压缩,直接供现在决策,再通过现在的这个物品把所有的决策进行类似松弛的操作。不可能决策范围只有一个,最优决策时压缩在数组里的,这里直接给出数组的定义:
dp[i][j]表示前i件物品,现在有j的空间最大可以得到的价值是多少
那么怎么通过之前的决策改变现在的决策呢?不同题目的决策肯定不同,而这种决策的转移往往称作状态转移方程,直接给出:
dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+val[i]|j>=w[i]}
是怎么得出的呢,对于每件物品而言,只有取它和不取它的两种方案,不妨都试一下,如果可以更优就记录,如果不会更优也不会有什么影响。(有空再写)

原创粉丝点击