贪心算法(基于C++)

文章基于此篇微信推送https://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg

简介

动态规划是一种由问题的最小子状态(边界)不断推出更大的状态,最后解决整个问题的解题思想。

基础概念

  1. 最优子结构:状态可被分解为的子状态
  2. 边界:无需在继续简化的最小子状态
  3. 状态转移公式:状态与其子状态间关系的描述公式
  4. 记忆话搜索:将每个状态对应的值记录下来,遇到相同的状态时就直接返回值,而不需要重复计算。

例题讲解

有一个国家发现了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工人。所以只要知道最初的状态,就可以推导出最终的结果。

最终代码:

猜你喜欢

转载自blog.csdn.net/li_l_il/article/details/84262772