通过金矿模型介绍动态规划

转载 2016年08月30日 16:20:39

http://www.cnblogs.com/sdjl/articles/1274312.html

----第四节----总结-------

 

       那么遇到问题如何用动态规划去解决呢?根据上面的分析我们可以按照下面的步骤去考虑:

 

       1、构造问题所对应的过程。

       2、思考过程的最后一个步骤,看看有哪些选择情况。

       3、找到最后一步的子问题,确保符合“子问题重叠”,把子问题中不相同的地方设置为参数。

       4、使得子问题符合“最优子结构”。

       5、找到边界,考虑边界的各种处理方式。

       6、确保满足“子问题独立”,一般而言,如果我们是在多个子问题中选择一个作为实施方案,而不会同时实施多个方案,那么子问题就是独立的。

       7、考虑如何做备忘录。

       8、分析所需时间是否满足要求。

       9、写出转移方程式。

      

 

 

 

 

----第五节----练习-------

 

       题目一:买书

       有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下:

      

       如果单独购买其中一卷,那么可以打9.5折。

       如果同时购买两卷不同的,那么可以打9折。

       如果同时购买三卷不同的,那么可以打8.5折。

      

       如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱呢?(x、y、z为三个已知整数)。

 

       当然,这道题完全可以不用动态规划来解,但是现在我们是要学习动态规划,因此请想想如何用动态规划来做?

 

       答案:

 

       1、过程为一次一次的购买,每一次购买也许只买一本(这有三种方案),或者买两本(这也有三种方案),或者三本一起买(这有一种方案),最后直到买完所有需要的书。

       2、最后一步我必然会在7种购买方案中选择一种,因此我要在7种购买方案中选择一个最佳情况。

       3、子问题是,我选择了某个方案后,如何使得购买剩余的书能用最少的钱?并且这个选择不会使得剩余的书为负数。母问题和子问题都是给定三卷书的购买量,求最少需要用的钱,所以有“子问题重叠”,问题中三个购买量设置为参数,分别为i、j、k。

       4、的确符合。

       5、边界是一次购买就可以买完所有的书,处理方式请读者自己考虑。

       6、每次选择最多有7种方案,并且不会同时实施其中多种,因此方案的选择互不影响,所以有“子问题独立”。

       7、我可以用minMoney[i][j][k]来保存购买第1卷i本,第2卷j本,第3卷k本时所需的最少金钱。

       8、共有x * y * z 个问题,每个问题面对7种选择,时间为:O( x * y * z * 7) =  O( x * y * z )。

       9、用函数MinMoney(i,j,k)来表示购买第1卷i本,第2卷j本,第3卷k本时所需的最少金钱,那么有:

              MinMoney(i,j,k)=min(s1,s2,s3,s4,s5,s6,s7),其中s1,s2,s3,s4,s5,s6,s7分别为对应的7种方案使用的最少金钱:

              s1 = 60 * 0.95 + MinMoney(i-1,j,k)

              s2 = 60 * 0.95 + MinMoney(i,j-1,k)

              s3 = 60 * 0.95 + MinMoney(i,j,k-1)

              s4 = (60 + 60) * 0.9 + MinMoney(i-1,j-1,k)

              s5 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)

              s6 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)

              s7 = (60 + 60 + 60) * 0.85 + MinMoney(i-1,j-1,k-1)

 

      

      

 

 

----第六节----代码参考------

 

 

       下面提供金矿问题的程序源代码帮助读者理解,并提供测试数据给大家练习。

 

       输入文件名为“beibao.in”,因为这个问题实际上就是背包问题,所以测试数据文件名就保留原名吧。

       输入文件第一行有两个数,第一个是国王可用用来开采金矿的总人数,第二个是总共发现的金矿数。

       输入文件的第2至n+1行每行有两个数,第i行的两个数分别表示第i-1个金矿需要的人数和可以得到的金子数。

 

       输出文件仅一个整数,表示能够得到的最大金子数。

 

       输入样例:

       100 5

       77 92

       22 22

       29 87

       50 46

       99 90

 

       输出样例:

       133

相关文章推荐

算法:动态规划之金矿问题(时间复杂度O(n*w))

算法:动态规划之金矿问题(时间复杂度O(n*w))

动态规划 金矿模型 01背包问题

今天在网上看到一个讲动态规划的文章,是以01背包为例的,这文章和书上的讲解非常不一样,令我眼前一亮,于是转载一下下~~~ (说明一下,本人非常痛恨教材公式定理漫天飞,实际的讲解却讲得非常枯涩难懂,这种...

动态规划入门之国王的金矿

最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.ne...
  • hhhzua
  • hhhzua
  • 2016年03月19日 10:16
  • 1912

经典的01背包问题(挖金矿)

虽然有点长,但是这确实是一个非常01背包问题,很适合学习01背包的时候学习,很一篇很不错的教材 经典的01背包问题 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是...

机器人挖金矿的动态规划算法

对于玩过星际的同学来说,都知道花50可以买一个机器人,然而每个机器人都有会在一定时间内采集一定的矿,例如每分钟可采矿5。于是有了我们今天的题目,输入初始机器人数量,初始金矿数量以及分钟数。求最多的采矿...

通过金矿模型介绍动态规划

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本...

动态规划基础之挖金矿问题

问题:有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同(情况如下图)。 金矿编号 黄金储量 需要人数 1 500 5 2 200 3 3 300 4...

通过金矿模型介绍动态规划

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本...

通过金矿模型介绍动态规划 (动态规划入门)

今天在网上看到一个讲动态规划的文章,是以01背包为例的,这文章和书上的讲解非常不一样,令我眼前一亮,于是转载一下下~~~ (说明一下,本人非常痛恨教材公式定理漫天飞,实际的讲解却讲得非常枯涩难懂,这...
  • Jolesen
  • Jolesen
  • 2016年12月16日 08:04
  • 171

通过金矿模型介绍动态规划

原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html ----第一节----初识动态规划--------          经典的01...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过金矿模型介绍动态规划
举报原因:
原因补充:

(最多只允许输入30个字)