1、问题提出
- 最近面试的过程中发现对基础算法的考察挺多的,准备复习下;
- 翻看些博客与书籍,发现介绍的过于书面化不易理解;
- 因此,将自己的理解写通俗一些,帮助他人与自己学习。
2、动态规划原理
从背包问题说起
一家商场搞活动,商家为顾客发放能够承重35磅的背包,顾客在商场内选择商品装入背包。假设商品有:
音响 3000美元 30磅
笔记本电脑 2000美元 20磅
吉他 1500美元 15磅
如何使得背包所含物品总价值最高?
此时若采用贪心算法则将音响装入背包,此时背包剩余空间为35-30=5磅,无法装入其余商品,背包价值为3000美元。
明显,此时贪心算法并非最优解。因为,将笔记本电脑与吉他装入背包,此时背包承重正好为35磅,且价值为3500美元。
因此,贪心算法常用来求解近似最优解(局部最优解),并非全局最优解。其特点是思想简单、求解速度快。
如何寻找全局最优解?
穷举法!那是不可能的,首先太耗时间且易出错,试想3件商品有8种选择方案,4件商品有16中选择方案,n件商品有中选择方案,因此,穷举法不现实。
动态规划,能够很好地得出最优解。
动态规划先解决子问题,再逐步解决大问题。对于背包问题,先解决子背包问题,再逐步解决原来的问题。
为方便举例子说明动态规划的思想,假设:
背包可装4磅东西
吉他 1500美元 1磅
音响 3000美元 4磅
笔记本电脑 2000美元 3磅
可将动态规划算法视作对网格的填充,背包问题的网格如下:
在对每个单元格放入商品时,需要判断背包的价值是否会增大。
首先,吉他行,重1磅价值1500美元,每一列都能够放下,得到下图价值列表:
其次,音响行,此时可供选择的商品包含该行与其上方的各行,即可选商品有吉他、音响。由于音响的重量为4磅,则背包容量至少需要4磅,因此容量为1、2、3的背包内商品不发生变化,商品仍为1500美元的吉他。在背包容量为4时,因为已经包含吉他商品占有1磅容量,剩余3磅不够存放音响,因此比较吉他与音响的价值,将价值较低的吉他取出,将价值偏高的音响放入其中。更新背包的价值列表,得到下图:
笔记本电脑行,笔记本电脑重量为3磅,价值2000美元,因此容量为1、2的背包内商品不发生变化。在背包容量为3磅时,已经含有重量1磅的吉他,无法放下重量3磅的笔记本电脑,因此将价值较低的吉他取出,将价值较高的笔记本电脑放入,得到下图:
对于容量为4磅的背包,因为容量为1的背包最大价值为1500美元,容量为3磅的背包最大价值为2000美元,且商品未重复,因此容量为4磅的背包价值最大为3500美元,得到下图:
此时,背包的最大价值为3500美元。
若此时新增价值为2000美元,重量为1磅的商品手机呢?
即下图中的最优解:
此时,1磅商品可放入1、2、3、4磅容量的背包,比较商品的价值。1磅手机的价值高于1磅吉他价值,因此1磅容量背包最大价值为2000美元。容量为2磅的背包中含有1磅的吉他,可再放入1磅商品,因此2磅容量的背包最大价值为1500+2000=3500美元。得到下图:
容量为3磅的背包此时已经含有重3磅价值2000美元的笔记本电脑,低于2磅容量背包的最大价值,因此将笔记本电脑替换为吉他、手机。得到下图:
对于最后一个单元格,当前最大价值为3500美元,选择手机则剩余3磅容量,3磅容量的最大值且不含有手机则为2000美元的笔记本,因此,4磅容量的最优解为2000+2000=4000美元。即选择笔记本电脑与手机,得到最终图如下:
商场又新增价值为1000美元重量为1磅的MP3,此时的最优解为?
结论为:
4500美元1磅手机2000美元、1磅吉他1500美元、1磅MP3 1000美元,共2000+1500+1000=4500美元。