子问题:

国王需要根据两个大臣的答案以及第9座金矿的信息才能判断出最多能够开采出多少金子。为了解决自己面临的问题,他需要给别人制造另外两个问题,这两个问题就是子问题。

思考动态规划的第一点----最优子结构:

国王相信,只要他的两个大臣能够回答出正确的答案(对于考虑能够开采出的金子数,最多的也就是最优的同时也就是正确的),再加上他的聪明的判断就一定能得到最终的正确答案。我们把这种子问题最优时母问题通过优化选择后一定最优的情况叫做“最优子结构”。

思考动态规划的第二点----子问题重叠:

实际上国王也好,大臣也好,所有人面对的都是同样的问题,即给你一定数量的人,给你一定数量的金矿,让你求出能够开采出来的最多金子数。我们把这种母问题与子问题本质上是同一个问题的情况称为“子问题重叠”。然而问题中出现的不同点往往就是被子问题之间传递的参数,比如这里的人数和金矿数。

思考动态规划的第三点----边界:

想想如果不存在前面我们提到的那些底层劳动者的话这个问题能解决吗?永远都不可能!我们把这种子问题在一定时候就不再需要提出子子问题的情况叫做边界,没有边界就会出现死循环。

思考动态规划的第四点----子问题独立:

要知道,当国王的两个大臣在思考他们自己的问题时他们是不会关心对方是如何计算怎样开采金矿的,因为他们知道,国王只会选择两个人中的一个作为最后方案,另一个人的方案并不会得到实施,因此一个人的决定对另一个人的决定是没有影响的。我们把这种一个母问题在对子问题选择时,当前被选择的子问题两两互不影响的情况叫做“子问题独立”。

这就是动态规划,具有“最优子结构”、“子问题重叠”、“边界”和“子问题独立”,当你发现你正在思考的问题具备这四个性质的话,那么恭喜你,你基本上已经找到了动态规划的方法。

有了上面的这几点,我们就可以写出动态规划的转移方程式,现在我们来写出对应这个问题的方程式,如果用gold[mineNum]表示第mineNum个金矿能够挖出的金子数,用peopleNeeded[mineNum]表示挖第mineNum个金矿需要的人数,用函数f(people,mineNum)表示当有people个人和编号为0、1、2、3、……、mineNum的金矿时能够得到的最大金子数的话,f(people,mineNum)等于什么呢?或者说f(people,mineNum)的转移方程是怎样的呢?

答案是:

当mineNum = 0且people >= peopleNeeded[mineNum]时 f(people,mineNum) = gold[mineNum]

当mineNum = 0且people < peopleNeeded[mineNum]时 f(people,mineNum) = 0

当mineNum != 0时 f(people,mineNum) = f(people-peopleNeeded[mineNum], mineNum-1) + gold[mineNum]与f(people, mineNum-1)中的较大者,前两个式子对应动态规划的“边界”,后一个式子对应动态规划的“最优子结构”请读者弄明白后再继续往下看。

思考动态规划的第五点----做备忘录:

正如上面所说的一样,当我们遇到相同的问题时,我们可以问同一个人。讲的通俗一点就是,我们可以把问题的解放在一个变量中,如果再次遇到这个问题就直接从变量中获得答案,因此每一个问题仅会计算一遍,如果不做备忘的话,动态规划就没有任何优势可言了。

思考动态规划的第六点----时间分析:

正如上面所说,如果我们用穷举的方法,至少需要2^n个常数时间,因为总共有2^n种情况需要考虑,如果在背包问题中,包的容量为1000,物品数为100,那么需要考虑2^100种情况,这个数大约为10的30次方。

而如果用动态规划,最多大概只有1000*100 = 100000个不同的问题,这和10的30次方比起来优势是很明显的。而实际情况并不会出现那么多不同的问题,比如在金矿模型中,如果所有的金矿所需人口都是1000个人,那么问题总数大约只有100个。

非正式地,我们可以很容易得到动态规划所需时间,如果共有questionCount个相同的子问题,而每一个问题需要面对chooseCount种选择时,我们所需时间就为questionCount * chooseCount个常数。在金矿模型中,子问题最多有大概people * n 个(其中people是用于开采金矿的总人数,n是金矿的总数),因此questionCount = people * n,而就像国王需要考虑是采用左部下的结果还是采用右部下的结果一样,每个问题面对两个选择,因此chooseCount = 2,所以程序运行时间为 T = O(questionCount * chooseCount) =O(people * n),别忘了实际上需要的时间小于这个值,根据所遇到的具体情况有所不同。

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

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

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

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

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

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

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

7、考虑如何做备忘录。

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

9、写出转移方程式。

挖金矿问题java课程设计_动态规划--国王挖金矿问题相关推荐

  1. ## 大一java课程设计_航班查询系统(我是小白)

    大一java课程设计_航班查询系统(我是小白) 备注:第一个java程序有借鉴别人的成分,因为忘了在哪个大佬上面借鉴的,所以在此备注,如有侵权,请联系删除,(仅用于学习使用,并未想盈利) 框体介绍 一 ...

  2. Java 课程设计_学生选课管理系统(控制台)

    Java 课程设计_学生选课管理系统 需求分析 本数据库的用户主要是学生,通过对用户需求的收集和分析,获得用户对数据库的如下要求. 1.信息需求 学生信息:学号,姓名,性别,专业 登陆信息:账号,密码 ...

  3. 宿舍住宿管理java课程设计_宿舍管理系统Java课程设计

    宿舍管理系统Java课程设计 Java 课程设计设计(论文) 题目: 宿舍管理系统 所 在 院: 专 业 : 班 级 : 学 生 姓 名: 学 号: 指 导 教 师: 年 月 日课程设计(论文)任务书 ...

  4. java经典问题国王_动态规划-国王的金矿问题java

    紧接着上一篇动态规划问题,现在我们开始探讨一个新的问题,问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一 ...

  5. 人事管理java 课程设计_数据库+Java课程设计 人事管理系统 (一)

    一.JAVA与数据库的合作 此次开发语言为Java,所用的数据库驱动是mysql-connector-java-5.1.8-bin.jar 第一步   用Java连接MySQL数据库(驱动下载:htt ...

  6. 编译原理java课程设计_编译原理课程设计词法分析

    一.课程设计任务及要求 1.1.目的 通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数 ...

  7. 弹跳的小球java课程设计_实例学习:弹跳的小球

    ## 题目要求 ## 小球在面板上弹跳.使用两个按钮暂停和重新开始小球的运动,使用一个滚动条控制小球弹跳的速度. ## 主要步骤 ## 1)创建一个JPanel的子类,将它命名为Ball,用来显示小球 ...

  8. java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc

    JAVA课程设计_闹钟的设计与实现项目-报告_附源代码 第2章 MACROBUTTON AcceptAllChangesInDoc [双击此处键入1级标题] PAGE 2 - PAGE 1 - .. ...

  9. java通讯录课程设计_java课程设计_通讯录_通讯簿.doc

    java课程设计_通讯录_通讯簿.doc 还剩 45页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: impor ...

  10. java基础应用程序超市收银_超市收银程序(JAVA课程设计 2011)

    <超市收银程序(JAVA课程设计 2011)>由会员分享,可在线阅读,更多相关<超市收银程序(JAVA课程设计 2011)(15页珍藏版)>请在人人文库网上搜索. 1.软零件研 ...

最新文章

  1. R语言广义线性模型Logistic回归模型亚组分析及森林图绘制
  2. 网络故障排除工具NeoTraceProTrial325
  3. DDR读写简介及相关
  4. AtCoder AGC017C Snuke and Spells
  5. Struts标签和OGNL表达式
  6. 连续,可积,存在原函数,变上限积分
  7. Windows 2016 服务器安全配置
  8. XMLConstants.FEATURE_SECURE_PROCESSING错误
  9. 【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面
  10. Hash表的初步认识
  11. 抖音矩阵号搭建及开发思路分享丨抖音矩阵源码丨抖音矩阵号运营
  12. P4720 【模板】扩展卢卡斯
  13. 知识分享 ITエンジニアの中途採用について③
  14. python字典元素由什么组成_【】Python中,字典、列表、元组分别用 、 、 作定界符,字典的每个元素由两部分组成,分别是 和 ,其中 不允许重复。...
  15. python发送esc_使用win32prin将一行文本发送到Python中的ESC/POS打印机
  16. “电脑疯子”更名启示:Windows XP pro with sp2 VOL(MSDN)中文版(正名)
  17. keil报错: ERROR 118 (ERRONEOUS REFERENCE TO EXTERNAL VARIABLES) 解决方案及原因
  18. firefox火狐插件(56旧版本适用)
  19. Socket编程---read方法阻塞问题
  20. R语言求解 常微分方程 绘制洛伦兹系统

热门文章

  1. python 怎么爬桌软件数据_python爬虫怎么从软件界面抓取数据?
  2. 如何清理卸下应用的残余文件_怎么清理手机卸载残留 需要技巧
  3. JAVA-计算两篇文章的相似度
  4. 数学建模常用算法案例k—means聚类分析
  5. 因特尔显卡自定义分辨率_如何在新版英特尔核芯显卡控制面板中自定义显示器分辨率...
  6. html表格某一行背景颜色设置,HTML表格行背景颜色与浮动属性不一样
  7. 网络访问计算机无法访问,无法访问,您可能没有权限使用网络资源的解决方法...
  8. 【蚂蚁链学习1】初识蚂蚁链的智能合约(solidity)
  9. 实用系列丨免费可商用视频素材库
  10. 上证50基金有哪些_“50”指数基金有哪些?