算法图解笔记——Chapter 9 dynamic programming
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7
9 动态规划
动态规划主要思想在于将问题分成小问题,并先着手解决这些小问题。
9.1 背包问题
再次回到昨天学到的背包问题。
解决方案一:
尝试各种可能的商品组合,并找出价值最高的组合。
但是在此方案下,运行速度将达到 O ( 2 n ) O(2^n) O(2n)。每增加一件商品,需要计算的集合都将指数形式增长。
解决方案二:
昨天了解近似求解的概念,针对这类问题就可以使用近似求解来寻找最优解,那么就可以使用动态规划算法,先解决子问题,再逐步解决大问题。类比此问题框架,那么就需要先解决小背包(子背包)问题,再逐步解决原来的问题。
假设每个动态规划算法都从一个网格开始,那么背包问题的网格为如下。
网格的各行为可选择的商品,各列为不同容量的背包。网格最初是空的,在填充满其中的每个单元格后,便能求出问题的答案。
-Row 1:吉他的重量刚好满足Column1 的1磅,那么可以将吉他的价格填入,相同操作,将吉他的价格填满第一行;在此行当前的最大价值为$1500
-Row 2:音响(4磅),对Column {1-3} 重量不满足所有继续填入$1500,在Column 4(4磅)中可以满足则填入 $3000;此时最大价值更新为$3000
-Row 3:笔记本电脑(3磅),与上述操作相同,可在Column3 填入 $2000。
商品 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
吉他 | $1500 | $1500 | $1500 | $1500 |
音响 | $1500 | $1500 | $1500 | $3000 |
笔记本电脑 | $1500 | $1500 | $2000 | —— |
那么针对(3,4)元素如何取值呢?针对4磅选取 可以有"音响$3000" 或 "笔记本$2000 + 吉他$1500"选择,这样就体现出了计算小空间的优势,可以凸显最大价值。显然选择“笔记本+吉他”。
商品 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
吉他 | $1500 | $1500 | $1500 | $1500 |
音响 | $1500 | $1500 | $1500 | $3000 |
笔记本电脑 | $1500 | $1500 | $2000 | $2000+$1500=$3500 |
在计算每个单元格的价值时,使用的公式都相同。
c e l l [ i ] [ j ]