贪心策略
贪心算法的贪心选择策略

贪心算法的贪心选择策略简介:贪心算法是一种常用的求解优化问题的算法思想,它通过每一步选择当前最优解来达到整体最优解,但贪心算法并不保证能够得到全局最优解。
这里我们将重点探讨贪心算法中的贪心选择策略,即在每一步中如何选择最优解。
一、贪心选择策略的定义贪心算法的核心在于贪心选择策略,即在每一步中,通过贪心的方式选择当前最优解。
贪心选择策略基于以下两个基本要素:1. 最优子结构:问题的最优解包含子问题的最优解。
2. 贪心选择性质:通过贪心选择策略,可以得到问题的最优解。
二、贪心选择策略的应用场景贪心算法适用于具有贪心选择性质的问题,即通过贪心选择策略可以得到问题的最优解。
以下是几个常见的应用场景:1. 区间调度问题:给定n个活动的开始时间和结束时间,要求选择出不相交的最多活动集合。
贪心算法选择结束时间最早的活动作为当前的最优解,并在此基础上进行递归调用。
2. 钱币找零问题:假设我们有几种不同面额的硬币,如1、5、10、20,我们要找零m元,如何选择硬币数量最少的方案。
贪心算法选择面额最大的硬币作为当前的最优解,并在此基础上进行递归调用。
3. 背包问题:给定n个物体的重量和价值,要求在限定的背包容量下选择一些物体,使得其总价值最大。
贪心算法可以选择单位重量价值最高的物体作为当前的最优解,并在此基础上进行递归调用。
三、贪心选择策略的实现步骤贪心选择策略的实现分为以下步骤:1. 确定问题的贪心选择策略:根据具体问题的特点,选择适合的贪心选择策略。
2. 构造问题的最优解:根据贪心选择策略,选择当前最优解,并将其添加到问题的最优解集合中。
3. 缩小问题规模:根据当前选择的最优解,更新原始问题,并缩小问题的规模。
4. 递归调用:对更新后的问题进行递归调用,直到得到问题的最优解。
四、贪心选择策略的优缺点贪心算法具有以下优点:1. 算法简单、易于实现。
2. 在某些情况下,可以快速求得问题的近似最优解。
3. 对于一些特定问题,贪心算法可以得到正确的最优解。
NOIP基础算法讲解2

while(i<=mid)do begin temp[p]:=a[i];inc(p);inc(i);end while(j<=right)do begin temp[p]:=a[j];inc(p);inc(i);end for i:=left to right do a[i]:=temp[i]; end;
数据范围:n≤10^6。所有数之和不超过10^9。
例题8:快速幂
【问题】计算an mod k的值 ,其中n<=109。
方法1:朴素算法。每次乘以a,时间复杂度O(n)。 function power(a,n:longint):longint; var x:longint; begin x:=1; for i:=1 to n do x:=x*a; power:=x; end;
时间效率不尽如人意….. 问题出现在哪里呢??
方法2:分治策略
采用分治求解: ➢划分问题:把序列分成元素个数尽量相等的两半; ➢递归求解:统计i和j均在左边或者均在右边的逆序对个数; ➢合并问题:统计i在左边,但j在右边的逆序对个数。
记数列a[st]~a[ed]的逆序对数目为d(st,ed); mid=(st+ed)/2,则有:
三、分治的三步骤
①划分问题:将要解决的问题分解成若干个规模较 小的同类子问题;
②递归求解:当子问题划分得足够小时,求解出子 问题的解。
③合并问题:将子问题的解逐层合并成原问题的解。
四、分治的框架结构
procedure Divide() begin
贪心算法是指,在对问题求解时,总是做出在当前

贪心算法是指,在对问题求解时,总是做出在当前各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢贪心算法。
贪心算法是指。
在对问题求解时。
总是做出在当前看来是最好的选择。
也就是说。
不从整体最优上加以考虑。
他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解。
关键是贪心策略的选择。
选择的贪心策略必须具备无后效性。
即某个状态以前的过程不会影响以后的状态。
只与当前状态有关。
中文名,贪心算法。
别称,贪婪算法。
性质,一种改进了的分级处理方法。
核心,根据题意选取一种量度标准。
基本要素。
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择。
即贪心选择来达到。
这是贪心算法可行的第一个基本要素。
也是贪心算法与动态规划算法的主要区别。
贪心选择是采用从顶向下。
以迭代的方法做出相继选择。
每做一次贪心选择就将所求问题简化为一个规模更小的子问题。
对于一个具体问题。
要确定它是否具有贪心选择的性质。
我们必须证明每一步所作的贪心选择最终能得到问题的最优解。
通常可以首先证明问题的一个整体最优解。
是从贪心选择开始的。
而且作了贪心选择后。
原问题简化为一个规模更小的类似子问题。
然后。
用数学归纳法证明。
通过每一步贪心选择。
最终可得到问题的一个整体最优解。
当一个问题的最优解包含其子问题的最优解时。
称此问题具有最优子结构性质。
运用贪心策略在每一次转化时都取得了最优解。
问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。
贪心算法的每一次操作都对结果产生直接影响。
而动态规划则不是。
贪心算法对每个子问题的解决方案都做出选择。
不能回退;动态规划则会根据以前的选择结果对当前进行选择。
有回退功能。
动态规划主要运用于二维或三维问题。
而贪心一般是一维问题。
基本思路。
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行。
根据某个优化测度。
每一步都要确保能获得局部最优解。
每一步只考虑一个数据。
他的选取应该满足局部优化的条件。
贪心算法 实验报告

贪心算法实验报告贪心算法实验报告引言:贪心算法是一种常用的算法设计策略,它通常用于求解最优化问题。
贪心算法的核心思想是在每一步选择中都选择当前最优的解,从而希望最终能够得到全局最优解。
本实验旨在通过实际案例的研究,探索贪心算法的应用和效果。
一、贪心算法的基本原理贪心算法的基本原理是每一步都选择当前最优解,而不考虑整体的最优解。
这种贪婪的选择策略通常是基于局部最优性的假设,即当前的选择对于后续步骤的选择没有影响。
贪心算法的优点是简单高效,但也存在一定的局限性。
二、实验案例:零钱兑换问题在本实验中,我们以零钱兑换问题为例,来说明贪心算法的应用。
问题描述:假设有不同面值的硬币,如1元、5元、10元、50元和100元,现在需要支付给客户x元,如何用最少的硬币数完成支付?解决思路:贪心算法可以通过每次选择当前面值最大的硬币来求解。
具体步骤如下:1. 初始化一个空的硬币集合,用于存放选出的硬币。
2. 从面值最大的硬币开始,如果当前硬币的面值小于等于待支付金额,则将该硬币放入集合中,并将待支付金额减去该硬币的面值。
3. 重复步骤2,直到待支付金额为0。
实验过程:以支付金额为36元为例,我们可以通过贪心算法求解最少硬币数。
首先,面值最大的硬币为100元,但36元不足以支付100元硬币,因此我们选择50元硬币。
此时,剩余待支付金额为36-50=-14元。
接下来,面值最大的硬币为50元,但待支付金额为负数,因此我们选择下一个面值最大的硬币,即10元硬币。
此时,剩余待支付金额为-14-10=-24元。
继续选择10元硬币,剩余待支付金额为-24-10=-34元。
再次选择10元硬币,剩余待支付金额为-34-10=-44元。
最后,选择5元硬币,剩余待支付金额为-44-5=-49元。
由于待支付金额已经为负数,我们无法继续选择硬币。
此时,集合中的硬币数为1个50元和3个10元,总共4个硬币。
实验结果:通过贪心算法,我们得到了36元支付所需的最少硬币数为4个。
贪心策略

基本思路
初看这一问题,很容易想到用贪心策略来求解, 即选择集合中最大的可以删除的数开始删起,直 到不能再删除为止,而且通过一些简单的例子来 验证,这一贪心标准似乎也是正确的,例如,当 m=2 , n=10 时 , 集 合 P = {2,3,…,10} , 运 用 上 述 “贪心标准”可以得到这一问题的正确的最优解 d=5+4+3=12,即其d-规则过程如下: 1. a=5 P={2,3,4,6,7,8,9} d=5 2. a=4 P={2,3,6,7,9} d=5+4=9 3. a=3 p={2,7} d=5+4+3=12
算法
问题初始化; 问题初始化; 按Vi从大到小将商品排序; 从大到小将商品排序;
{读入数据}
I := 1; repeat if M = 0 then Break; {如果卡车满载则跳出循环} M := M - Wi; if M >= 0 then 将第I种商品全部装入卡车 else 将(M + Wi)重量的物品I装入卡车; I := I + 1; {选择下一种商品} until (M <= 0) OR (I >= N)
算法
I := 1 {汽车出发设定为第1个加油站} L := C*D2; {油箱装满油能行驶的距离} repeat 在L距离以内,向后找第一个油价比I站便宜的加油站J; if J存在 then if I站剩余油能到达J then 计算到达J站的剩油 else 在I站购买油,使汽车恰好能到达J站 else 在I站加满油; I := J; {汽车到达J站} until 汽车到达终点;
分析
但是,如果再仔细地分析一个例子, m=3, 但是,如果再仔细地分析一个例子,当m=3,n= 18时 如果还是使用上述“贪心标准” 18时,如果还是使用上述“贪心标准”,则得到 问题的d 规则总分为d=35 d=35, 问题的d-规则总分为d=35,其d-规则序列为 9,8,7,6,5),而实际上可以得到最大d ),而实际上可以得到最大 (9,8,7,6,5),而实际上可以得到最大d-规则总 分为d 38,其对应的d 分为d=38,其对应的d-规则序列为 9,8,7,6,3,5)。 (9,8,7,6,3,5)。 为什么会出现这样的反例呢? 为什么会出现这样的反例呢? 这是因为,问题中要使得d 规则总分d值越大, 这是因为,问题中要使得d-规则总分d值越大, 不光是要求每一个d分值越大越好, 不光是要求每一个d分值越大越好,也要求取得 分值越多越好。 的d分值越多越好。 因此,本题不能采用上述的贪心策略求解 求解。 因此,本题不能采用上述的贪心策略求解。
算法策略的总结

算法策略的总结策略是⾯向问题的,算法是⾯向实现的。
⼀、不同算法策略特点⼩结1、贪⼼策略贪⼼策略⼀⽅⾯是求解过程⽐较简单的算法,另⼀⽅⾯它⼜是对能适⽤问题的条件要求最严格(即适⽤范围很⼩)的算法。
贪⼼策略解决问题是按⼀定顺序,在只考虑当前局部信息的情况下,就做出⼀定的决策,最终得出问题的解。
即:通过局部最优决策能得到全局最优决策2、递推策略递推也是由当前问题的逐步解决从⽽得到整个问题的解,依赖于信息间本⾝的递推关系,每⼀步不需要决策参与到算法中,更多⽤于计算3、递归策略递归常常⽤于分治算法、动态规划算法中。
递归是利⽤⼤问题与其⼦问题间的递推关系来解决问题的。
能采⽤递归策略的算法⼀般有以下特征:(1)为求解规模为N的问题,设法将它分解成规模较⼩的问题,然后从这些⼩问题的解⽅便地构造出⼤问题的解(2)并且这些规模较⼩的问题也能采⽤同样的分解和综合⽅法,分解成更⼩的问题,并从这些更⼩的问题的解构造出规模较⼤问题的解(3)特别的,当规模N = 1时,能直接得解4、枚举策略对问题所有的解逐⼀尝试,从⽽找出问题的真正解。
⼀般⽤于决策类问题,很难找到⼤、⼩规模之间的关系,也不易对问题进⾏分解。
5、递归回溯策略类似于枚举,通过尝试遍历问题各个可能解的通路,当发现此路不通时,回溯到上⼀步继续尝试别的通路。
6、分治策略分治⼀般⽤于较复杂的问题,必须可以逐步被分解为容易解决的独⽴的⼦问题,这些⼦问题解决后,进⽽将它们的解“合成”,就得到较⼤问题的解,最终合成为总问题的解。
7、动态规划策略与贪⼼类似,也是通过多阶段决策过程来解决问题。
每个阶段决策的结果是⼀个决策结果序列,这个结果序列中,最终哪⼀个是最优的结果,取决于以后每个阶段的决策,当然每次决策结果序列都必须进⾏存储。
因此是“⾼效率,⾼消费的算法”。
同时,它⼜与递归法类似,当问题不能分解为独⽴的阶段,却⼜符合最优化原理时,就可以使⽤动态规划法,通过递归决策过程,逐步找出⼦问题的最优解,从⽽决策出问题的解。
贪心策略

一、贪心策略的定义【定义1】贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。
其实,从"贪心策略"一词我们便可以看出,贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心策略可以得到最优解或较优解。
二、贪心算法的特点通过上文的介绍,可能有人会问:贪心算法有什么样的特点呢?我认为,适用于贪心算法解决的问题应具有以下2个特点:1、贪心选择性质:所谓贪心选择性质是指应用同一规则f,将原问题变为一个相似的、但规模更小的子问题、而后的每一步都是当前看似最佳的选择。
这种选择依赖于已做出的选择,但不依赖于未做出的选择。
从全局来看,运用贪心策略解决的问题在程序的运行过程中无回溯过程。
关于贪心选择性质,读者可在后文给出的贪心策略状态空间图中得到深刻地体会。
2、局部最优解:我们通过特点2向大家介绍了贪心策略的数学描述。
由于运用贪心策略解题在每一次都取得了最优解,但能够保证局部最优解得不一定是贪心算法。
如大家所熟悉得动态规划算法就可以满足局部最优解,在广度优先搜索(BFS)中的解题过程亦可以满足局部最优解。
在遇到具体问题时,往往分不清哪些题该用贪心策略求解,哪些题该用动态规划法求解。
在此,我们对两种解题策略进行比较。
三、贪心策略的理论基础--矩阵胚正如前文所说的那样,贪心策略是最接近人类认知思维的一种解题策略。
但是,越是显而易见的方法往往越难以证明。
下面我们就来介绍贪心策略的理论--矩阵胚。
"矩阵胚"理论是一种能够确定贪心策略何时能够产生最优解的理论,虽然这套理论还很不完善,但在求解最优化问题时发挥着越来越重要的作用。
【定义3】矩阵胚是一个序对M=[S,I] ,其中S是一个有序非空集合,I是S的一个非空子集,成为S的一个独立子集。
优化算法改进策略总结

优化算法改进策略总结
优化算法改进策略总结的关键是根据具体问题的特点,选择合适的改进策略和技巧。
下面总结几种常见的优化算法改进策略:
1.贪心策略:贪心算法选择局部最优解,并希望通过不断选择
局部最优解来达到全局最优解。
贪心策略适用于那些具有贪心选择性质的问题。
2.动态规划:动态规划通过将原问题划分为多个子问题,并保
存子问题的解,通过递推求解子问题来得到原问题的解。
动态规划适用于具有重叠子问题和最优子结构的问题。
3.分支界定:分支界定通过建立一个解空间树,将搜索过程转
化为对解空间树的遍历,通过剪枝操作来减少搜索空间。
分支界定适用于具有可行解空间结构的问题。
4.回溯法:回溯法通过试探和回溯的方式来寻找问题的解,它
适用于具有多个可能解,并且每个可能解满足一定的约束条件的问题。
5.深度优先搜索:深度优先搜索通过不断地向前搜索到不能再
继续搜索为止,然后回退到上一个节点,再继续搜索。
深度优先搜索适用于解空间较大,但解的深度较小的问题。
6.广度优先搜索:广度优先搜索通过不断地将当前节点的所有
相邻节点入队,然后按照队列中的顺序进行遍历,直到找到目标节点或者遍历完所有节点。
广度优先搜索适用于解空间较小,
但解的广度较大的问题。
总的来说,对于优化算法的改进策略,需要根据具体问题的特点进行选择,针对问题的特点使用合适的算法和技巧,以提高算法的效率和准确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2016/6/22 计算机算法设计与分析 8
贪心算法的一般框架
GreedyAlgorithm(parameters){ 初始化; 重复执行以下的操作: 选择当前可以选择的(相容)最优解; 将所选择的当前解加入到问题的解中; 直至满足问题求解的结束条件。 }
2016/6/22
应用实例
策略1不正确。 活动安排问题—直觉贪心策略分析 反例:S={1, 2, 3},a1=<0, 20>, a2=<2, 5>, a3=<8, 15>。
策略2不正确。 反例: S={1, 2, 3},a1=<0, 8>, a2=<7, 9>, a3=<8, 15>。
策略3正确?
活动安排问题
贪心法设计举例
例5.2 用贪心法求解货币兑付问题。设支付现金
A=25.9元,支付集合P= {10、5、1、 0.5,0.2、0.1元各10张} 解: 最少货币张数 — 贪心选择货币面值大者。
s s s s = = = = ф {10} {10,10} {10,10,5,0.5,0.2,0.2}
15.9 5.9 0
(3)假设算法前k步正确,令i1=1, i2, …, ik是前k步顺序选 择的活动,则原问题最优解可表示为A={i1=1, i2, …, ik}∪B, 令S’是S中剩余的与i1, i2, …, ik相容的活动,即S’={j | sj≥fk, j∈S},则B是S’的一个最优解。
若不然,假设S’有最优解B’,且|B’| > |B|,那么用B’替 换B可以得到的解={i1=1, i2, …, ik} ∪ B’将比A的活动更多, 与A为最优解矛盾。
第四章
贪心策略
2016/6/22 计算机算法设计与分析 1
贪心法
在实际问题中,经常会遇到求一个问题的可行 解和最优解的问题,这就是所谓的最优化问题
。
每个最优化问题都包含一组限制条件和一个优 化函数,符合条件的解决方案称为可行解,使 优化函数取得最佳值的可行解称为最优解。
贪心法
贪心法是求解这类问题的一种常用算法,它从问题的 某一个初始解出发,采用逐步构造最优解的方法向给 定的目标前进。(问题:与分治法、递归、动态规划等 的关系、比较?) 在每个局部阶段,都做出一个看上去最优的决策(即某 种意义下的、或某个标准下的局部最优解),并期望通 过每次所做的局部最优选择产生出一个全局最优解。
做出贪心决策的依据称为贪心准则(策略)
问题:
贪心法的特点/优点是什么?贪心法与穷举法、 回溯法、动态规划等方法的比较?
可以用贪心法解决的问题有什么特点?什么样
的问题适合于用贪心法来解决? 用贪心法解题时,如何判断能否保证得到最优 解?若不能得到最优解,该如何处理?
找硬币
假设有四种硬币,面值分别为
贪心算法的设计要素
可以用贪心算法求解的问题一般具
有2个重要的性质:
– –
最优子结构性质。 贪心选择性质
贪心算法的设计要素
最优子结构性质
当一个问题的最优解包含其子问题的最优解时 ,称此问题具有最优子结构性质。问题的最优 子结构性质是该问题可用动态规划算法或贪心 算法求解的关键特征。
贪心算法的设计要素
应用实例
活动安排问题—实例计算过程
设待安排的11个活动的开始时间和结束时间按结束时 间的非减序排列如下:
i s[i] 1 1 2 3 3 0 4 5 5 3 6 5 7 6 8 8 9 8 10 2 11 12
f[i]
4
5
6
7
8
9
10
11
12
13
14
首先选定活动1,其结束时间f[1]=4。 然后因s[4] = 5≥4,选定活动4,这时f[4] = 7。 又因s[8] = 8≥7,选定活动8,这时f[8] = 11。 最后因s[11] = 12≥11,选定活动11。
贪心法的正确性问题
针对具体问题不同,贪心策略的选择可能有多种 ,如何选择合适的贪心策略并证明该策略的正确 性是贪心算法设计中的一个关键问题。 一般可以通过对算法步数的归纳或通过对问题规 模的归纳来证明贪心法的正确性。 证明贪心选择将导致整体的最优解: 首先证明存在问题的一个整体最优解必定包含 了第一个贪心选择。 然后证明在做了贪心选择后,原问题简化为规 模较小的类似子问题,即可继续使用贪心选择。 于是用数学归纳法可证明,经过一系列贪心选 择可以得到整体最优解。
背包问题
2016/6/22 计算机算法设计与分析 29
问题描述
给定n个物品和一个背包。物品i的重量为wi, 价值为vi,背包容量为C。问如何选择装入背包 中的物品,使得装入背包的物品的价值最大? 在装入背包时,每种物品i只有两种选择,装入 或者不装入,既不能装入多次,也不能只装入 一部分。因此,此问题称为0-1背包问题。 如果在装入背包时,物品可以切割,即可以只 装入一部分,这种情况下的问题称为背包问题。
贪心算法
一般地,有这样一类问题:它有n个输入,而它的解就由 这n个输入的某个子集组成,只是这个子集必须满足某些事 先给定的条件。把那些必须满足的条件称为约束条件;而 把满足约束条件的子集称为该问题的可行解。为了衡量可 行解的优劣,事先给出了一定的标准。一般以函数形式给 出,称为目标函数。那些使目标函数取极值(极大或极小) 的可行解,称为最优解。 贪心法也是一个多步决策法。每一步选择都使得能构成问 题的一个可行解,同时使目标函数的值增加最快(求max) 或增加最小(如求min),这种选择过程是以某些最优量度 为根据,而最优化量度有时可以是目标函数本身,也可以是 别的量度。最优化度量的选择是贪心算法的关键。
2016/6/22 计算机算法设计与分析 7
贪心算法的特点
贪心算法中,较大子问题的解恰好包含 了较小子问题的解作为子集,这与动态 规划算法设计中的优化原则本质上是一 致的。 贪心算法在某一步决定优化函数的最大 或最小值时,不考虑子问题的计算结果 ,而是根据当时情况采取“只顾眼前” 的贪心策略决定取舍。
活动实例
应用实例
策略1:尽早占用。 策略2:时间占用少 活动安排问题 —直觉贪心策略 的活动先安排。 把活动按照开始时间 从小到大排序,使得 计算每个活动占用时 间fi-si,按照占用时 s1 ≤ s2 ≤… ≤sn,然 后从前向后挑选,只 间从小到大对活动排 要与前面选择的活动 序,使得f1-s1 ≤ f2-s2 相容,便将这项活动 ≤… ≤fn-sn,然后从 选入最大相容集合A。 前向后挑选,只要与 前面活动相容,便将 这项活动选入最大相 容集合A。 策略3:早完成的活 动先安排。 把活动按照截止时间 从小到大排序,使得 f1 ≤ f2 ≤… ≤fn ,然后 从前向后挑选,只要 与前面选择的活动相 容,便将这项活动选 入最大相容集合A。
贪心算法的基本思路
基本思路
1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解 。 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解;
由于输入的活动以其完成时间的非减序排
列,所以算法greedySelector每次总是选 择具有最早完成时间的相容活动加入集合A 中。直观上,按这种方法选择相容活动为 未安排活动留下尽可能多的时间。也就是 说,该算法的贪心选择的意义是使剩余的 可安排时间段极大化,以便安排尽可能多 的相容活动。
应用实例
template<class Type> 各活动起始时间 void GreedySelector(int n, Type s[], 与结束时间分别 Type f[], bool A[]) { 存储于数组s和f A[1] = true; 活动安排问题 —算法设计与分析中,且f中活动 int j= 1; 按结束时间非递 for (int i=2;i<=n;i++) { 减排序,即f1 ≤f2 if (s[i]>=f[j]) { A[i]=true; ≤… ≤fn。 j=i; } else A[i]=false; 时间复杂度O(n) } 预排序O(nlogn) } 该算法的贪心选择的意义是使剩余的可安排时间段极大化,以 便安排尽可能多的相容活动。
有n个活动申请使用同一个礼堂,每项活动有一个开始 活动安排问题 时间和一个截止时间,如果任何两个活动不能同时举 行,问如何选择这些活动,从而使得被安排的活动数 量达到最多? 设S={1, 2, …, n}为活动的集合,si和fi分别为活动i的开 始和截止时间,i=1, 2, …, n。定义 活动i与j相容:si ≥ fj或sj ≥fi, i≠j 求S最大的两两相容的活动子集。
二角五分 一角 五分 一分
现在要找给某顾客六角三分钱,哪种找钱方法拿出 的硬币个数最少呢? 首先选出一个面值不超过六角三分的最大硬 币,即二角五分;然后从六角三分中减去二角五 二角五分 二角五分 一角 一分 一分 一分 分,剩下三角八分;再选出一个面值不超过三角 八分的最大硬币,即又一个二角五分,如此一直 做下去。这种方法实际上就是贪心算法。
(2)算法第一步选择S中的活动1,设算法最终得到问题 最优解为A={i1, i2, …, ij},则i1=1;(算法第一步正确) 活动安排问题—贪心策略正确性证明 若i1≠1,用1替换i1,可得到A’=(A-{i1})∪{1},集合A’与A 中活动个数相同,且1比i1结束的更早,因此与i2, i3, …, ij 相容,于是A’也是问题的一个最优解。
计算机算法设计与分析
9
其设计方法描述如下: