背包问题
再看上一节的背包问题,假设你是一个小偷,背着一个可装4磅东西的背包。
可盗窃的商品有3件。
简单算法
最简单的算法如下:尝试各种可能的商品组合,并找出价值最高的组合。
这样可行,但速度非常慢。在有3件商品的情况下,需要计算8种不同的集合;有4件商品时,需要计算16个集合。每增加一件商品时,需要计算的集合数都将翻倍。这种算法的运行时间为O(2^n)。
贪婪算法可以找到近似解,但是不能找到最优解。
动态规划
对于背包问题,先决定小背包(子背包)问题,在逐步解决原来的问题。
每个动态规划算法都从一个网格开始,背包问题的网格如下:
网格的各行为商品,各列为不同容量(1~4磅)的背包。所有这些列你都需要,因为他们将帮助你计算子背包的价值。
网格最初是空的,你将填充其中的每个单元格,网格填满后,就找到了问题的答案。
吉他行
这是吉他行,意味着你将尝试将吉他装入背包。在每个单元格,都需要做一个简单的决定:偷不偷吉他?
第一个单元格表示背包的容量为1磅。吉他的重量也是一磅,这意味着它能装入背包!因此这个单元格包含吉他,价值为1500美元。
与这个单元格一样,每个单元格都将包含当前可装入背包的所有商品。
这行的其他单元格也一样,别忘了,这是第一行,只有吉他可供选择。换言之,假装现在还没有盗窃其他两件商品。
动态规划从小问题着手,逐步解决大问题。这里解决的子问题将帮助你解决的大问题。从图中该行可得出,如果有一个容量4磅的背包,可在其中装入的商品的最大价值为1500美元。
音响行
来填充下一行——音响行。现在处于第二行,可偷的商品有吉他和音响。在每一行,可偷的商品都为当前行的商品以及之前各行的商品。因此还不能偷笔记本电脑,而只能偷音响和吉他。
先看第一个单元格,它表示容量为1磅的背包。在此之前,可装入1磅背包的商品的最大价值为1500美元。
背包的容量为1,装不下音响!由于容量1磅的背包装不下音响,因此最大价值依然是1500美元。
接下来两个单元格的情况依然如此。在这些单元格中,背包的容量分为2磅和3磅,而以前的最大价值为1500美元。
由于这些背包装不下音响, 因此最大价值保持不变。背包容量为4磅才能装下音响。原来最大价值为1500美元,但如果在背包装入的是音响而不是吉他,价值将为3000美元。
在这个网格中,将逐步地更新最大价值。
笔记本电脑行
下面以同样的方式处理笔记本电脑。笔记本电脑中3磅,没法将其装入容量为1磅或2磅的背包,因此前两个单元格的最大价值还是1500美元。
对于容量为3磅的背包,原来的最大价值为1500美元,但现在可选择盗窃价值2000美元的笔记本电脑而不是吉他,这样新的最大价值将为2000美元。
对于4磅的背包,这是非常重要的部分。当前最大价值为3000美元。但是笔记本的重量只有3磅,还有1磅容量没用!
在1磅的容量中,可装入的商品的最大价值是1500,之前有计算过。因此需要看下音响 vs 笔记本和吉他。那边价值更高。
最终的网格类似如下
答案如下:将吉他和笔记本电脑装入背包时价值最高,为3500美元。
你可能认为,计算最后一个单元格的价值,使用了不同的公式。那是因为填充之前的单元格时,故意避开了一些复杂的因素。其实,计算每个单元格的价值时,使用的公式都相同,公式如下: