贪心算法案例.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2 贪心法与最优策略 学习要点 贪心算法的求解方法 贪心算法的2个要素 (1)贪心选择性质 (2)最优子结构性质 应用范例 (1)活动安排问题; (2)背包问题; (3)最优装载问题; (4)哈夫曼编码和数据压缩; (5)单源最短路径问题; (6)最小生成树的kruskal方法; (7)带有限期的作业排序; (8)旅行商问题 ( 近似算法 ) 2.1 贪心算法概述 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解, 如单源最短路经问题、最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的近似解。 例2.1 付款问题 找零问题。如26.8。 “贪心” 原则:尽量给顾客大面值的钱。 20、5、1、0.5、0.2、0.1 问题描述: 已知:int m[]={500,200,100,50,20,10,5,2,1}; int v; 输出:各种钞票数 int n[9], 使得 9 9 Σ n[i]*m[i]=v 且Σn[i]最小。 i=1 i=1 void pay(int m[],int v){ int i,r,n[9]; for(i=0;i9;i++)n[i]=0; r=v; i=0; while (r0) { if (m[i]=r) { r-=m[i]; n[i]++; } else i++; } for(i=0;i9;i++) 输出n[i]个m[i]面值的钞票。 } 本节讨论可以用贪心算法求解的问题的一般特征。 对于一个具体的问题,怎么知道是否可用贪心算法 解此问题,以及能否得到问题的最优解呢? 这个问题很 难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到这 类问题一般具有2个重要的性质: 贪心选择性质 和 最优子结构性质。 2.1.2 贪心选择性质 在求解一个问题的过程中,如果在每一阶段的选择都是当前状态下的最优选择,即局部最优选择,并且最终能够求得问题的整体最优解,那么说明这个问题可以通过贪心选择来求解,这时就说此问题具有贪心选择性质。 对于一个具体问题,要确定它是否具有贪心选择性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。 2.1.2 贪心选择性质 根据前面对贪心选择性质的定义,要证明一个问题具有贪心选择性质只要证明通过我们每一步所作的贪心选择使得在最后得到问题的一个整体最优解就可以了。 通常采用如下的证明过程: 首先假设问题的一个整体最优解,那么第一步要证明可以把这个最优解修改成从贪心选择开始,此时原问题就简化成为与原问题相似得一个子问题。接下来,使用数学归纳法证明通过每一步的贪心选择可以得到问题的一个整体最优解。 2.1.3 最优子结构性质 当一个问题的最优解包含着它的子问题的最优解时,称此问题具有最优子结构性质 。 换句话说,问题的整体最优性依赖于其局部子问题解的最优性。 这个性质决定了一个问题是否可以使用贪心算法来求解。 例2.2 活动安排问题 例2.2 活动安排问题 设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下: 活动安排算法设计 void GreedySelecter(int n, elemtype b[], elemtype e[], bool x[]) { x[1]=true; //活动1进行,保证算法以贪心选择开始 int j=1; for (int i=2;i=n;i++) { //依次判断每个活动的可行性 if (

文档评论(0)

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

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

1亿VIP精品文档

相关文档