- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3篇 核心篇-贪婪算法
贪婪算法的设计思想 【基本思想】将问题的求解过程看作是一系列选择,每次选 择一个输入,每次选择都是当前状态下的最好选择(局部最 优解),每作一次选择后,所求问题会简化为一个规模更小的子问题,从而通过每一步的最优解逐步达到整体的最优解。 引例 [找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。 假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。 售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪婪准则如下: 每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。 算法思想 为使找回的零钱的硬币数最小,不考虑找零钱的所有各种方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,只当不足大面值币种的金额才会去考虑下一种较小面值的币种,这就是在采用贪婪法。 这种方法在这里之所以总是最优,是因为银行对其发行的硬币种类和硬币面值的巧妙安排。 如果只有面值分别为1,5和11单位的硬币,而希望找回总额为15单位的硬币,按贪婪算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币。但最优的解答应是3个5单位面值的硬币。 活动安排问题 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。 活动安排问题 【算法设计思想】 a 和 b 活动的开始时刻小于结束时刻 Begin[a]End[a] Begin[b]End[b] b活动的开始时刻大于等于 a活动的结束时刻,即 Begin[b] = End[a] 记为 b a 这时 b活动与 a活动不重叠,则选择活动b加入集合中,否则不选择该活动。 活动安排问题 【例】设待安排的12个活动的开始时间和结束 时间按结束时间的非减序排列如下: //输出选择的活动 void OutputResult(int Select[N]) { cout{ 0; for( int i=1;iN;i++) if (Select[i]==1) cout, i ; cout } endl; } void main( ) { int Begin[N]={1,3,0,3,2,5,6,4,10,8,15,15};//活动的最早开始时间 int End[N]={3,4,7,8,9,10,12,14,15,18,19,20};//活动的最早结束的事件 static int Select[N]; int TimeStart=0; GreedySelector(Begin,End,Select); OutputResult (Select); } 3、贪心算法的基本要素 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质。 3 贪心算法的基本要素 【贪心选择性质】 所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 贪心算法则通常以自顶向下的方式进行,以迭代的方式 作出相继的贪心选择,每作一次贪心选择就将所求问题 简化为规模更小的子问题。 【算法缺点】对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。 3 贪心算法的基本要素 【最优子结构性质】 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 0-1背包问题: 整数背包 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 背包问题: 分数背包 与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。 首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高
文档评论(0)