程序设计基础12_1_贪心法汇总.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
11 8 4 3 1 n=1 0 1 2 3 4 5 6 7 8 9 10 11 M=5 6 8 11 Total length n=2 n=3 12.1.3贪心法解题的一般步骤 上面三个任务所用的算法由一个共同点,就是在求最优解的过程中,每一步都采用一种局部最优的策略,把问题范围和规模逐渐缩小,最后把每一步的结果合并起来得到一个全局的最优解。 在例12.1中,每次选取删除的数字都是第一个递减区间的首位数字,也就是当前的删除可以保证在当前删除位数要求下的最优解,同时使剩下的数字串逐渐接近最后要求的目标最优解。 12.1.3贪心法解题的一般步骤 在例12.2中,每一次选取的时间都是满足条件的最早结束事件,向问题的解答前进一步,同时给剩余事件的选取留下了最多的不重叠时间;最后得到的事件序列,就是每一次选取的事件集合。 在例12.3中,每一步都将覆盖最大间隔的线段断开,使得线段总长度减少,同时使线段数目更接近最大数目限制;最后得到的最小线段总长度,其实是计算过程唯一确定的一种线段覆盖方式得到的。 归纳以上三个任务的求解过程,可以总结出运用贪心法解题的一般步骤是: 从问题的某个初始解出发; 采用循环语句,当可以向求解目标前进一步时,根据局部最优策略,得到一个部分解,缩小问题的范围或规模; 将所有部分解综合起来,得到问题的最终解。 人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。 * 第12章 贪心法与动态规划 12.1 贪 心 法 12.2 动 态 规 划 问题:假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少,应如何找零? 找零问题 解决方法: 首先选出1张面值不超过4元6角的最大面值的货币,即2元; 再选出1张面值不超过2元6角的最大面值的货币,即2元; 再选出1张面值不超过6角的最大面值的货币,即5角; 再选出1张面值不超过1角的最大面值的货币,即1角; 总共付出4张货币。 找零问题 这就是贪心选择! 找零问题中的贪心 在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。 付款问题的贪心选择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢地增加,这正体现了贪心法的设计思想。 贪心法的思想 在实际生活中,经常会遇到类似求一个问题的可行解和最优解的要求,这就是所谓的最优化问题。每个最优化问题都包含一组限制条件和一个优化函数,符合限制条件的问题求解方案称为可行解,使优化函数取得最佳值的可行解称为最优解。 贪心法的思想 贪心法是求解这类问题最优解的一种常用算法: 它从问题的某个初始解出发,采用逐步构造最优解的方法向给定的目标推进。 在每个局部阶段,都做出一个看上去最优的决策(即某种意义下的、或某个标准下的局部最优解),并期望通过每次所做的的局部最优选择产生出一个全局最优解。 做出贪心决策的依据称为贪心准则(策略),决策一旦做出,就不可再更改。 贪心与递推的不同之处:贪心推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择(操作),不断地将问题实例归纳为更小的相似问题。贪心准则是正确解决贪心问题的关键。 贪心法的基本思路: (1)建立数学模型来描述问题; (2)把求解的问题分成若干个子问题; (3)对每一子问题求解,得到子问题的局部最优解。 (4)把子问题的解局部最优解合成原来解问题的一个解。   【例12.1】删数问题 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。 比如:n=178543,s=4 则输出 13 ,表示正整数178543,删除4位数字后得到的最小值是 13。 (1)由于给定的正整数有效位数是100位,用一般的整数类型(包括长整数)无法表示,可以考虑用字符串来存储正整数。 (2)如何决定哪s位数字被删除呢?被删除的是否是最大的s个数字呢?为了尽可能逼近目标,采用贪心法来解决问题, 选取的贪心策略为: ①把对s个数字的删除,看成是一个逐步实现的过程,每一步删除一个数字,用s步完成对s个数字的删除。 ②每一步总是选择一个使剩下的数最小的数字完成删除,也就是按照

文档评论(0)

502992 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档