文章基于此篇微信推送https://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg
简介
动态规划是一种由问题的最小子状态(边界)不断推出更大的状态,最后解决整个问题的解题思想。
基础概念
- 最优子结构:状态可被分解为的子状态
- 边界:无需在继续简化的最小子状态
- 状态转移公式:状态与其子状态间关系的描述公式
- 记忆话搜索:将每个状态对应的值记录下来,遇到相同的状态时就直接返回值,而不需要重复计算。
例题讲解
有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?
解答:
1.寻找最优子结构
4金矿10工人时的最优选择和4金矿(10-第五个金矿所需工人)时的最优选择。
2.寻找状态转移方程
a. 设金矿数量为n,工人数量为w,金矿的黄金量为G[ ],金矿的用工量为P[ ]。例如5坐金矿和4坐金矿之间的最优选择存在关系:F(5,10)=max(F(4,10),F(4,10-P[4]+G[4]))
b. 确定问题边界
当工人数量w大于等于最后一个金矿用工量P[0]时,F(n,w)=G[0]
当工人数量w小于最后一个金矿用工量P[0]时,F[n,w]=0
c. 总结得到状态注意方程(组)
F(n,w) = 0 (n<=1, w<p[0]);
F(n,w) = g[0] (n==1, w>=p[0]);
F(n,w) = F(n-1,w) (n>1, w<p[n-1])
F(n,w) = max(F(n-1,w), F(n-1,w-p[n-1])+g[n-1]) (n>1, w>=p[n-1])
3.实现
a. 分析
说明:
第一列代表给定的1-5座金矿的情况
第一行代表剩余工人数,即w
空格表示F(n,w)
第一座金矿:400金,需5人
第二座金矿500金,需5人
第三座金矿200金,需3人
第四座金矿300金,需4工人
第五座金矿350金,需3工人
归纳:
每个状态都有前一行的状态推导而来。例如3金矿8工人的结果来自于Max(500,500+200),即2金矿5工人和2金矿8工人。所以只要知道最初的状态,就可以推导出最终的结果。
最终代码: