第6章 贪心算法资料.

合集下载

C语言的贪心算法

C语言的贪心算法

C语言的贪心算法贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解的算法策略。

C语言中实现贪心算法相对简单,下面将详细介绍贪心算法的基本思想、应用场景以及一些常见问题。

一、贪心算法的基本思想贪心算法的基本思想是每一步选择中都采取当前状态下最优的选择,也就是局部最优解。

它的核心思想是:当面临一个问题时,选择当前最优解作为解决方案,并希望通过这种局部最优解的选择,最终能够获得全局最优解。

贪心算法的基本过程如下:1.建立数学模型来描述问题。

2.将问题分解为若干子问题。

3.选取当前最优解作为局部最优解,并保存,计算得出最优解。

4.利用局部最优解重新构建问题,然后继续迭代进行求解。

5.终止条件:达到最优解,或者不能再分解为子问题,或者满足特定条件。

二、贪心算法的应用场景贪心算法在很多问题的解决中都具有广泛的应用,但它并不是万能的,只适用于满足贪心选择性质的问题。

常见的应用场景包括:1. 最小生成树:如Prim算法和Kruskal算法。

2. 最短路径问题:如Dijkstra算法。

3.活动安排问题:如区间调度问题。

4.霍夫曼编码:用于数据压缩。

5.背包问题:如0-1背包问题和部分分数背包问题。

6.跳跃游戏:在一定规则下,从起点跳到终点,每一步跳跃的最大距离为当前位置上的数值,并判断是否能跳到终点。

三、贪心算法的示例问题1.区间调度问题假设有n个区间,每个区间都有一个开始时间和结束时间,现在需要选出不重叠的区间个数最多的子集。

贪心选择策略是:优先选择结束时间早的区间,然后从剩余区间中再次选择结束时间早的区间。

可以按照以下步骤实现:a.对区间按照结束时间进行升序排序。

b.选择第一个区间,结束时间最早。

c.从剩余区间中选择结束时间与前一个区间开始时间不重叠的区间。

d.重复步骤c,直到无法再选出满足条件的区间为止。

2.霍夫曼编码问题给定一个字母集合和其对应的概率,现需要将字母集合进行编码,使得总编码长度最短。

贪心算法的基本原理

贪心算法的基本原理

贪心算法的基本原理贪心算法(Greedy Algorithm)是一种常用的算法思想,它在求解最优化问题时通常能够得到较好的近似解。

贪心算法的基本原理是:每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。

在实际应用中,贪心算法常常用于解决一些最优化问题,如最小生成树、最短路径、任务调度等。

一、贪心算法的特点贪心算法具有以下特点:1. 简单:贪心算法通常比较简单,易于实现和理解。

2. 高效:贪心算法的时间复杂度通常较低,能够在较短的时间内得到结果。

3. 局部最优:每一步都选择当前状态下的最优解,但不能保证最终能够得到全局最优解。

4. 适用范围:贪心算法适用于一些特定类型的问题,如无后效性、最优子结构等。

二、贪心算法的基本原理贪心算法的基本原理可以概括为以下几个步骤:1. 初始状态:确定问题的初始状态,定义问题的输入和输出。

2. 状态转移:根据当前状态,选择局部最优解,并更新状态。

3. 筛选解:判断当前状态下是否满足问题的约束条件,若满足则保留该解,否则舍弃。

4. 终止条件:重复以上步骤,直至满足终止条件,得到最终解。

三、贪心算法的应用举例1. 找零钱:假设有 25、10、5、1 四种面额的硬币,需要找零 41 元,如何使得找零的硬币数量最少?贪心算法可以先选择面额最大的硬币,然后逐步选择面额较小的硬币,直至找零完毕。

2. 区间调度:给定一组区间,如何选择最多的互不重叠的区间?贪心算法可以先按照区间的结束时间排序,然后依次选择结束时间最早的区间,直至所有区间都被覆盖。

3. 最小生成树:在一个连通的带权无向图中,如何选择边使得生成树的权值最小?贪心算法可以按照边的权值从小到大排序,然后依次选择权值最小且不构成环的边,直至所有顶点都被连接。

四、贪心算法的优缺点1. 优点:贪心算法简单高效,适用于一些特定类型的问题,能够在较短的时间内得到近似最优解。

2. 缺点:贪心算法不能保证一定能够得到全局最优解,可能会出现局部最优解不是全局最优解的情况。

贪心算法程序设计

贪心算法程序设计

贪心算法程序设计贪心算法程序设计1. 什么是贪心算法贪心算法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。

贪心算法的核心思想是局部最优解能导致全局最优解。

2. 贪心算法的基本步骤贪心算法的基本步骤如下:1. 定义问题的优化目标。

2. 将问题分解成子问题。

3. 选择当前最优的子问题解,将子问题的解合并成原问题的解。

4. 检查是否达到了问题的优化目标,如果没有达到,则回到第二步,继续寻找下一个最优子问题解。

5. 在所有子问题解合并成原问题解后,得到问题的最优解。

3. 贪心算法的应用场景贪心算法的应用非常广泛,几乎可以用于解决各种优化问题。

以下几个常见的应用场景:1. 零钱找零问题:给定一定面额的纸币和硬币,如何找零使得所需纸币和硬币的数量最小?2. 区间调度问题:给定一些活动的开始时间和结束时间,如何安排活动使得可以办理的活动数量最大?3. 背包问题:给定一些具有重量和价值的物品,如何选择物品使得背包的总价值最大?4. 最小树问题:给定一个带权无向图,如何找到一棵树,使得它的边权之和最小?5. 哈夫曼编码问题:给定一组字符和相应的频率,如何构造一个满足最低编码长度限制的二进制编码?4. 贪心算法的优缺点贪心算法的优点是简单、高效,可以快速得到一个近似最优解。

而且对于一些问题,贪心算法能够得到全局最优解。

贪心算法的缺点在于它不一定能够得到全局最优解,因为在每一步只考虑局部最优解,无法回溯到之前的选择。

5. 贪心算法的程序设计在使用贪心算法进行程序设计时,通常需要以下几个步骤:1. 定义问题的优化目标。

2. 将问题分解成子问题,并设计子问题的解决方案。

3. 设计贪心选择策略,选择局部最优解。

4. 设计贪心算法的递推或迭代公式。

5. 判断贪心算法是否能够得到全局最优解。

6. 编写程序实现贪心算法。

6.贪心算法是一种常见的算法思想,它在每一步选择中都采取当前状态下的最优选择,从而希望最终达到全局最优解。

贪心算法的常用范围

贪心算法的常用范围

贪心算法的常用范围一、什么是贪心算法?听我说,贪心算法其实就像你身边那些总是想着“现在最好的”那一类人。

啥意思呢?就是他们做事从来不考虑长远,只看眼前能捞多少,想法很简单,行动也特别直接。

比如说你去吃自助餐,眼前有一盘热腾腾的牛排,你只顾着夹那块,脑袋里想的就是“现在不吃,等下没了怎么办”。

这就有点像贪心算法,它在每一步选择中都追求局部的最优解。

问题是,这种做法能得出全局最优解吗?不一定哦。

所以,贪心算法适用的地方就有点挑剔,它只适合那些能通过局部最优解来推导出全局最优解的情况。

二、贪心算法的常见应用1. 活动安排问题咱们先来说个生活中常见的例子,活动安排问题。

假设你是一个忙碌的白领,今天有好多活动要参加,可惜你一整天的时间有限。

怎么安排才能把活动都参加个遍呢?如果你是那种贪心心态的家伙,你会选择哪个活动呢?肯定是选那些花费时间最少,能带来最大回报的活动嘛!简单粗暴的办法就像贪心算法一样,选择每一个最短时间的活动,把空余的时间都填满。

最终,你可能会发现,虽然你参加了很多活动,但并不一定能让你得到最大的收益。

所以说,这个问题就是一个典型的贪心算法的使用场景。

2. 找零问题还有个经典的例子是找零问题。

你去商店买东西,店员找给你零钱。

那如果你是商店的老板,应该怎么挑零钱呢?你肯定会选择把金额大的零钱先找给顾客吧,简单快捷又高效。

比如,顾客给你100块钱,你就找个50块、20块,再来几张5块,剩下的用1块来凑,最后一结账,顾客就满意地走了。

这个过程中,你是按照每次找最大的零钱进行选择,这就是贪心算法的一个典型应用。

找零问题背后就是一个在每一步都做出“局部最优选择”的过程,能够确保找到的零钱数量最少,操作也最为高效。

3. 最短路径问题再说个计算机里的例子,最短路径问题。

在一个图中,假如你是要从A点出发去B 点,你要怎么走才能最省力、最省时?这里的贪心算法会告诉你:每次从当前位置出发,选择一个最短的路径走,这样一步一步走下去,最后就能到达B点了。

贪心算法(陈鹏)

贪心算法(陈鹏)

— 20 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[贪心算法解题的一般步骤] 1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明) ·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
— 12 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI201——纪念品分组(NOIP2007普及组)
[输入输出样例] 输入: 输出: 100 6 9 90 20 20 30 50 60 70 80 90
若无法证明, 此步骤可缺省
— 21 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[典型的贪心算法简介] 贪心策略在树和图论中有着极其重要的应用,Prim、 Kruskal、Huffman等体现“贪心”思想的算法更是广泛地 应用于树与图的处理。 下面介绍一种利用“贪心”思想的算法——哈夫曼 (Huffman)树。
—7—
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
1、贪心概念
[求解这类问题的方法] 1、搜索 最原始的方法是搜索(穷举)法。当然,为了尽快搜 索出解,我们往往会利用限制条件进行可行性判断剪枝, 或利用目标函数的上界(或下界)进行分枝定界。 2、动态规划 第二种解决此类问题的方法是动态规划。当然,使用 动态规划必须要满足一些条件,如无后效性和最优子结构 等等。

贪心算法知识点总结

贪心算法知识点总结

贪心算法知识点总结1. 基本原理贪心算法的基本原理是每一步都选择当前状态下的最优解,以期望最终得到全局最优解。

具体来说,贪心算法通常可以分为以下几个步骤:1)从问题的某个初始解出发2)采用一种迭代的方式,逐步将初始解进行优化3)每一步都是基于当前状态的最优选择来进行优化4)直到无法再进行优化,得到问题的最优解由于贪心算法每一步都要选择局部最优解,因此贪心算法通常具有高效性。

然而,贪心算法并不适用于所有问题,其结果不一定是全局最优解。

因此,在使用贪心算法时需要注意问题的特性和约束条件,以免得到错误的结果。

2. 适用情况贪心算法通常适用于满足以下条件的问题:1)问题的最优解满足“最优子结构”性质:即问题的最优解包含了其子问题的最优解2)问题的求解过程具有“贪心选择性”:即每一步都选择当前状态下的最优解,并不需要考虑未来的后果3)问题的约束条件可以通过局部最优选择满足全局最优解:即问题的解空间中存在一些局部最优解,可以通过一系列的局部最优解构建全局最优解在实际应用中,贪心算法通常用于求解最优化问题,如最小生成树、最短路径、任务调度等问题。

由于贪心算法的高效性,它通常能够在较短的时间内得到较为接近最优解的结果。

然而,贪心算法并不适用于所有问题,对于一些问题,贪心算法将得到错误的结果。

因此,在使用贪心算法时需要谨慎选择问题类型和约束条件,以避免错误的结果。

3. 贪心算法实例在下面的部分,我们将介绍一些常见的贪心算法实例,包括背包问题、活动安排问题、霍夫曼编码等。

3.1 背包问题背包问题是一个经典的优化问题,它包括0-1背包问题、分数背包问题等多种类型。

在0-1背包问题中,给定n种物品和一个容量为C的背包,每种物品i的重量为w[i],价值为v[i],求在不超过背包容量的情况下,如何选择物品放入背包,可以使得背包中的总价值最大。

对于0-1背包问题,贪心算法通常不能得到最优解。

然而,在分数背包问题中,贪心算法通常可以得到近似的最优解。

C++算法-6.贪心算法

C++算法-6.贪心算法

例如:n=175438 s=4 删数的过程如下: n=175438 //删掉7 15438 //删掉5 1438 //删掉4 138 //删掉8 13 //解为13 这样,删数问题就与如何寻找递减区间首字符这样一个简单的问题对应起来。 不过还要注意一个细节性的问题,就是可能会出现字符串串首有若干0的情况, 甚至整个字符串都是0的情况。按以上贪心策略编制的程序框架如下 输入n,s; for (i=1;i<=s;++i) { //一共要删除s个字符 for ( j=0;j<len-1;++j ) //从串首开始找,len是n的长度 if ( n[j]>n[j+1] ) { //找到第一个符合条件的 for ( k=j;k<len-1;++k ) //删除字符串n的第j个字符 ,后面字符往前整 n[k]=n[k+1]; break; } --len; //长度减1 } 输出n; //删去串首可能产生的无用零
下面来看看0-1背包问题。 给定一个最大载重量为M的卡车和N种动物。已知第i种动物的重量为Wi, 其最大价值为Vi,设定M,Wi,Vi均为整数,编程确定一个装货方案,使得装 入卡车中的所有动物总价值最大。 【分析】对于n种动物,要么被装,要么不装,也就是说在满足卡车载重的 条件下,如何选择动物,使得动物价值最大的问题。 即确定一组x1,x2,…,xn, xi∈{0,1} f(x)=max(∑xi*vi) 其中,∑(xi*wi)≦w 从直观上来看,我们可以按照上例一样选择那些价值大,而重量轻的动物。 也就是可以按价值质量比(vi/wi)的大小来进行选择。可以看出,每做一次选 择,都是从剩下的动物中选择那些vi/wi最大的,这种局部最优的选择是否能满 足全局最优呢?我们来看看一个简单的例子: 设n=3,卡车最大载重量是100,三种动物a、b、c的重量分别是40,50, 70,其对应的总价值分别是80、100、150。 情况a:按照上述思路,三种动物的vi/wi分别为2,2,2.14。显然,我们首先 选择动物c,得到价值150,然后任意选择a或b,由于卡车最大载重为100,因 此卡车不能装载其他动物。 情况b:不按上述约束条件,直接选择a和b。可以得到价值80+100=180, 卡车装载的重量为40+50=90。没有超过卡车的实际载重,因此也是一种可行 解,显然,这种解比上一种解要优化。

贪 心 算 法

贪 心 算 法

贪心算法及几个常用的例题贪心算法:一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。

也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。

必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

二、贪心算法的基本思路:1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

三、贪心算法适用的问题贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

实际上,贪心算法适用的情况很少。

一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架从问题的某一初始解出发;while (能朝给定总目标前进一步)利用可行的决策,求出可行解的一个解元素;由所有解元素组合成问题的一个可行解;五、贪心策略的选择因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

几个经典的例子:一、定义什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。

也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。

贪心算法的基本思路如下:1. .建立数学模型来描述问题。

2. 把求解的问题分成若干个子问题。

3. 对每个子问题求解,得到每个子问题的局部最优解。

4. 把每个子问题的局部最优解合成为原来问题的一个解。

贪心算法及其应用

贪心算法及其应用

贪心算法及其应用近年来,随着科技的发展和数据的爆炸式增长,优化问题成为了研究的热点。

在高效解决各种优化问题中,贪心算法发挥了重要作用。

本文将介绍贪心算法的定义、特点、优缺点及其常见应用。

一、什么是贪心算法贪心算法是一种常见的算法方法,通过贪心策略来求解问题的最优解。

其思想是在每一个阶段上,选择当前最优解的策略,最终得到的就是问题的最优解。

二、贪心算法的特点贪心算法具有以下特点:1、局部最优解一定是全局最优解的一个组成部分;2、求解过程中不需要回溯;3、贪心算法具有高效性,时间复杂度低。

三、贪心算法的优缺点1、优点贪心算法具有简单、高效等优点。

对于那些没有明确要求最优解的问题,贪心算法是一个不错的选择。

2、缺点贪心算法的局限性在于,有些问题不能用贪心策略求得最优解。

因为每一步选择的最优解并不一定能导致全局最优解。

此外,贪心算法需要注意到问题的结构性质,否则可能做出错误决策。

四、贪心算法的应用1、背包问题背包问题是一个最经典的贪心算法应用场景。

在这个问题中,我们需要将一组物品放到一个容器中。

每个物品有一个权值和一个体积。

容器有一个最大承载体积,求容器可以承载的最大权值。

使用贪心算法在背包问题中是具有局限性的。

但是,在有些情况下,贪心策略是可行的。

例如在只考虑单个维度时,贪心算法以效率极高的速度求得其最优解。

2、最小生成树最小生成树问题是一个常见的求解问题。

其问题的目标是在一张图中找到一棵生成树,该树的所有边权之和最小。

在这个问题中,我们采用贪心策略选择当前最优边并添加到生成树中,以此来求得最优解。

3、哈夫曼编码哈夫曼编码是一种广泛应用的数据压缩算法。

其通过根据字符出现频率选择具有最小权值的二叉树节点,最终构建出哈夫曼树,以此来表示字符的编码信息。

使用哈夫曼编码可以实现对数据的高效压缩和解压缩。

4、调度问题在调度问题中,我们需要找到一种方案,让若干任务在满足约束条件的前提下,以最短的时间完成。

例如,在机器调度问题中,我们需要为不同机器安排任务以最小化整体完成时间。

贪心算法的原理是

贪心算法的原理是

贪心算法的原理是
贪心算法是一种求解最优问题的常用算法思想,其基本原理是在每一步选择中都采取当前状态下最优的选择,从而希望最终得到全局最优解。

贪心算法的主要特点是局部最优策略同时也是全局最优策略。

贪心算法通常包含以下步骤:
1. 确定问题的最优子结构:即问题的整体最优解可以通过一系列局部最优解来达到。

这是贪心算法的基础,也是保证贪心选择性质的关键。

2. 构造贪心选择:通过局部最优策略来构造每一步的最优解,不考虑前面步骤的选择是否能够达到全局最优。

3. 解决子问题:将子问题缩小,通过递归或迭代的方式求解。

4. 合并子问题的解:将子问题的解合并起来,形成原问题的解。

贪心算法的正确性依赖于贪心选择性质和最优子结构性质。

贪心选择性质指的是,通过局部最优解就可以推导出全局最优解。

最优子结构性质指的是,问题的整体最优解可以通过一系列局部最优解来达到。

贪心算法的应用广泛,常见的问题包括:
1. 找零钱问题:给定一些面额不同的硬币和一个总金额,如何用最少数量的硬币凑出总金额。

2. 区间调度问题:给定一些活动的开始时间和结束时间,如何安排活动使得参加的活动数量最多。

3. Huffman编码问题:如何用最短的编码长度来表示一个给定概率分布的字符集。

虽然贪心算法通常能够在很短的时间内找到一个解,但并不是所有问题都适合使用贪心算法。

贪心算法不能保证得到最优解,只能保证得到一个近似最优解。

因此,在使用贪心算法解决问题时需要根据具体问题的特性来判断是否适合使用贪心算法。

贪心算法概述及研讨

贪心算法概述及研讨

对贪心算法的概述和研讨福州第一中学高一(8)班汪涛指导老师:陈颖算法总览当一个问题具有“最优子结构”时,我们可以采用动态规划法解决该问题。

但是有的时候,贪心算法可以更好的处理该类问题。

总体上看,贪心算法是一种高效的、不稳定的算法;但是它在解决问题时有很多独特的优良性质,掌握贪心算法有时可以非常迅速的获得最优解或近似最优解。

关键字:贪心算法(贪婪算法),贪心算法的应用举例,Object Pascal,快速算法,不稳定算法,信息学奥赛。

何时采用何时能,又何时应该采用贪心算法呢?一般认为,凡是经过数学归纳法证明可以采用贪心算法的情况,都应该采用它。

因为它的效率是很高的。

贪心算法的弱点在于它的不稳定性,即有时它不总能返回最优解。

那么能采用贪心算法的问题具有怎样的性质呢?(何时采用贪心算法)1、它具有和动态规划问题相似的性质,即分治法中的“最优子结构”性质,即每个子问题的最优解的集合就是整体最优解。

这是必须的性质,因为贪心算法解决的问题流程就需要依序研究每个子问题,然后综合之得出最后结果。

不能采用分治法解决的问题,是理论上是不能使用贪心算法的。

而且,必须拥有最优子结构性质,才能保证贪心算法返回最优解。

2、它必须具有一种特殊的“贪心选择性”。

这种性质类同于“最优子结构”性质,但又有一些小的差别。

我们知道,在动态规划中,每一个父问题结果的得出需要它的子问题作为条件;但是“贪心选择性”则不需要;贪心选择性所做的是一个非线性的子问题处理过程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。

要证明一个问题具有“贪心选择性”,就必须证明每一步所做的贪心选择最终导致一个问题的整体最优解。

这也是必须的性质。

如果一个问题具有上述两个性质,理论上就应该采用贪心算法。

处理流程经由贪心算法处理的问题需要经过排序。

即把“最贪心”的子结果排在序列的最前面,一直到“最不贪心的”。

这是处理问题的第一步。

然后依序解决问题而得出最终结果。

贪心算法

贪心算法

6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4

种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。

每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。

算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。

算法导论-贪心算法

算法导论-贪心算法

算法导论——贪心算法求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。

对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的算法。

贪心算法(greedy algorithm)就是这样的算法,它在每一步都做出当时看起来最佳的选择。

也就是说,它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。

本章介绍一些贪心算法能找到最优解的最优化问题。

贪心算法并不保证得到最优解,但对很多问题确实可以求得最优解。

我们首先在16.1节介绍一个简单但非平凡的问题—活动选择问题,这是一个可以用贪心算法求得最优解的问题。

首先考虑用动态规划方法解决这个问题,然后证明一直做出贪心选择就可以得到最优解,从而得到一个贪心算法。

16. 2节会回顾贪心方法的基本要素,并给出一个直接的方法,可用来证明贪心算法的正确性。

16. 3节提出贪心技术的一个重要应用:设计数据压缩编码(Huffman编码)。

在16. 4节中,我们讨论一种称为“拟阵"(matroid)的组合结构的理论基础,贪心算法总是能获得这种结构的最优解。

最后,16. 5节将拟阵应用于单位时间任务调度问题,每个任务均有截止时间和超时惩罚。

贪心方法是一种强有力的算法设计方法,可以很好地解决很多问题。

在后面的章节中,我们会提出很多利用贪心策略设计的算法,包括最小生成树(minimum-spanning-tree)算法(第23章)、单源最短路径的djikstra算法(第24章),以及集合覆盖问题的Chvatal贪心启发式算法(第35章)。

最小生成树算法提供了一个经典的贪心方法的例子。

16.1 贪心选择假如我们无需求解所有子问题就可以选择出一个活动加人到最优解,将会怎样?这将使我们省去递归式(16. 2)中固有的考查所有选择的过程。

实际上,对于活动选择问题,我们只需考虑一个选择:贪心选择。

对于活动选择问题,什么是贪心选择?直观上,我们应该选择这样一个活动,选出它后剩下的资源应能被尽量多的其他任务所用。

贪心算法-例题讲解

贪心算法-例题讲解

贪⼼算法-例题讲解前⾔:此博客在写作过程中参考了⼤量资料和博客,不能⼀⼀列举,还请见谅。

概述贪⼼法:从问题的某⼀个初始状态出发,逐步构造最优解从⽽向⽬标前进,并期望通过这种⽅法产⽣出⼀个全局最优解的⽅法贪⼼是⼀种解题策略,也是⼀种解题思想,⽽不是算法贪⼼策略与其他算法的区别贪⼼与递推:贪⼼法推进每⼀步不依据某⼀固定的递推式,⽽是当前看似最佳的贪⼼决策,不断的将问题归纳为更加⼩的相似的⼦问题贪⼼与动态规划:贪⼼是“⿏⽬⼨光”;动态规划是“统揽全局”贪⼼法的优缺点优点:思维复杂度低、代码量⼩、运⾏效率⾼、空间复杂度低等缺点:很难找到⼀个简单可⾏并且保证正确的贪⼼思路贪⼼算法的应⽤贪⼼算法的常⽤范围有明显的贪⼼可证明贪⼼策略的贪⼼(最常见的)贪⼼数据结构:堆/Kruskal/Prim/Dijkstra博弈/游戏策略,这些策略⼤多是贪⼼求较优解或多次逼近求最优解⼏个简单的贪⼼例⼦最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C贪⼼策略:先拿轻的部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量⾼。

每⼀个物体可以只取⾛⼀部分,价值和重量按⽐例计算贪⼼策略:先拿性价⽐⾼的乘船问题:有n个⼈,第i个⼈重量为wi。

每艘船的载重量均为C,最多乘两个⼈。

⽤最少的船装载所有⼈贪⼼策略:最轻的⼈和最重的⼈配对例题(基础)1.删数问题-【问题描述】键盘输⼊⼀个⾼精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成⼀个新的正整数。

编程对给定的n和s,寻求⼀种⽅案,使得剩下组成的新数最⼩。

贪⼼策略为:每⼀步总是选择⼀个使剩下的数最⼩的数字删去,即按⾼位到低位的顺序搜索,若各位数字递增,则删除最后⼀个数字,否则删除第⼀个递减区间的⾸字符。

然后回到串⾸,按上述规则再删除下⼀个数字。

重复以上过程s次,剩下的数字串便是问题的解了。

贪心算法的实验原理

贪心算法的实验原理

贪心算法的实验原理贪心算法是一种基于贪心策略的算法,它在每个步骤中选择局部最优解,最终希望得到全局最优解。

因为贪心算法只关注当前局部最优解,而不考虑未来可能发生的变化,因此不一定能够得到全局最优解。

贪心算法的实验原理是通过对每个部分的最优或局部最优解做出选择,最终以得到全局最优解为目的进行优化的算法。

它在每个步骤中都尽可能地选取当前最优的选择,希望通过每一步的最优选择,实现最终结果的最优化。

在实现贪心算法时,需要明确贪心策略以及贪心策略的正确性,以保证算法能够得出正确的结果。

贪心算法的正确性可以通过以下几个方面来分析:1. 子问题的最优解能够推出原问题的最优解。

这意味着每个子问题都是局部最优解,并且子问题之间相互独立,不会互相影响。

2. 贪心策略能够保证每个步骤选取的局部最优解是全局最优解的一部分。

具体来说,每个步骤的最优解都应该满足贪心选择性质和最优子结构性质。

3. 贪心算法的选择性质和最优子结构性质都可以通过归纳法来证明。

对于选择性质,假设最终结果不是局部最优解的组合,而是由不同的选择组成的组合。

我们可以证明,将任意一个非局部最优选择替换为其局部最优选择,最终结果仍然是全局最优解。

对于最优子结构性质,假设设子问题的最优解可以推导出原问题的最优解。

我们可以证明,当我们将一个子问题的最优解与另一个子问题的最优解组合在一起时,可以得到原问题的最优解。

贪心算法与动态规划算法都可以用于求解优化问题。

与动态规划算法相比,贪心算法常常更快、更简单,但其结果有时并不一定是最优的。

对于某些优化问题,贪心算法可以得到与动态规划算法相近甚至相等的结果,但对于某些问题,贪心算法则难以得到全局最优解。

贪心算法

贪心算法

max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件式,并使目标函数式达到最大的解向量X=(x1, x2, …, xn)。
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快 地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。 (2)选择重量最轻的物品,因为这可以装入尽可 能多的物品,从而增加背包的总价值。但是,虽然 每一步选择使背包的容量消耗得慢了,但背包的价 值却没能保证迅速增长,从而不能保证目标函数达 到最大。 (3)选择单位重量价值最大的物品,在背包价值 增长和背包容量消耗两者之间寻找平衡。
算法
main( ) { int i,j,n,GZ,A; int B[8]={0,100,50,20,10,5,2,1},S[8]; input(n); for(i=1;i<=n;i++) { input(GZ); for(j=1,j<=7;j++) { A=GZ/B[j]; S[j]=S[j]+A; GZ=GZ-A*B[j];} } for(i=1;i<=7;i++) print(B[i], “----”, S[i]); }
∞ b 4 0 a 8 h ∞ 4 b 4 0 a 8 h 8 11 7 11 7
8 ∞ i 6 1 2
∞ c
7
∞ d 14 9 e ∞ 10
4 g ∞
2
f ∞
(a)
8 ∞ i 6 1 g ∞ 2 4 f ∞ ∞ c 7 ∞ d 14 9 e ∞ 10 2
贪心法求解活动安排问题的关键是如何选择贪心策略,使 得按照一定的顺序选择相容活动,并能安排尽量多的活动。至 少有两种看似合理的贪心策略: (1)最早开始时间:这样可以增大资源的利用率。 (2)最早结束时间:这样可以使下一个活动尽早开始。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【例2】部分背包问题
给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知
第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,
使得装入卡车中的所有物品总价值最大。
【算法分析】
因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它
局部最优满足全局最优,可以用贪心法解答,方法如下:先将单位块收益按从大到小进
向给定的目标递推。但不同的是,推进的每一步不是依据某一固定的递推式,而是做
一个局部的最优选择,即贪心选择(在例中,这种贪心选择表现为选择一行中的最大
整数),这样,不断的将问题归纳为若干相似的子问题,最终产生出一个全局最优解。
特别注意的是,局部贪心的选择是否可以得出全局最优是能否采用贪心法的关键
所在。对于能否使用贪心策略,应从理论上予以证明。下面我们看看另一个问题。
下面来看看0-1背包问题。 给定一个最大载重量为M的卡车和N种动物。已知第i种动物的重量为Wi,
其最大价值为Vi,设定M,Wi,Vi均为整数,编程确定一个装货方案,使得装 入卡车中的所有动物总价值最大。
【分析】对于n种动物,要么被装,要么不装,也就是说在满足卡车载重的 条件下,如何选择动物,使得动物价值最大的问题。
cin>>n>>r; memset(s,0,sizeof(s));
//初始化
j=0; minx=0; for (i=1;i<=n;++i)
//用贪心法求解
{
j++; if (j==r+1) j=1; s[j]+=a[i];
//前r个人为一组,第r+1个人回到第一个水龙 //加上等待时间
设n=3,卡车最大载重量是100,三种动物a、b、c的重量分别是40,50, 70,其对应的总价值分别是80、100、150。
情况a:按照上述思路,三种动物的vi/wi分别为2,2,2.14。显然,我们首先 选择动物c,得到价值150,然后任意选择a或b,由于卡车最大载重为100,因 此卡车不能装载其他动物。
行排列,然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。
因此我们非常容易设计出如下算法:
问题初始化;
//读入数据
按Vi从大到小将商品排序;来自i=1;do{
if (m==0) break;
//如果卡车满载则跳出循环
m=m-w[i];
if (m>=0)
//将第i种商品全部装入卡车
else 将(m+w[i]) 重量的物品i装入卡车;
i=i+1;
//选择下一种商品
}while (m>0&&i<=n);
在解决上述问题的过程中,首先根据题设条件,找到了贪心选择标准(Vi),
并依据这个标准直接逐步去求最优解,这种解题策略被称为贪心法。
因此,利用贪心策略解题,需要解决两个问题: 首先,确定问题是否能用贪心策略求解;一般来说,适用于贪心策略 求解的问题具有以下特点: ①可通过局部的贪心选择来达到问题的全局最优解。运用贪心策略解 题,一般来说需要一步步的进行多次的贪心选择。在经过一次贪心选择之 后,原问题将变成一个相似的,但规模更小的问题,而后的每一步都是当 前看似最佳的选择,且每一个选择都仅做一次。 ②原问题的最优解包含子问题的最优解,即问题具有最优子结构的性 质。在背包问题中,第一次选择单位重量价值最大的货物,它是第一个子 问题的最优解,第二次选择剩下的货物中单位重量价值最大的货物,同样 是第二个子问题的最优解,依次类推。 ③其次,如何选择一个贪心标准?正确的贪心标准可以得到问题的最 优解,在确定采用贪心策略解决问题时,不能随意的判断贪心标准是否正 确,尤其不要被表面上看似正确的贪心标准所迷惑。在得出贪心标准之后 应给予严格的数学证明。
(可以用数学方法简单证明,这里就不再赘述),所以这道题可以用贪心法解答,基本步
骤:
(1)将输入的时间按从小到大排序;
(2)将排序后的时间按顺序依次放入每个水龙头的队列中;
(3)统计,输出答案。
【样例输入】
【样例输出】
42
//4人打水,2个水龙头
23
2645
//每个打水时间
参考程序主要框架如下:
//总共花费时间
即确定一组x1,x2,…,xn, xi∈{0,1} f(x)=max(∑xi*vi) 其中,∑(xi*wi)≦w
从直观上来看,我们可以按照上例一样选择那些价值大,而重量轻的动物。 也就是可以按价值质量比(vi/wi)的大小来进行选择。可以看出,每做一次选 择,都是从剩下的动物中选择那些vi/wi最大的,这种局部最优的选择是否能满 足全局最优呢?我们来看看一个简单的例子:
第六章 贪心算法
若在求解一个问题时,能根据每次所得到的局部最优解,推导出全局最
优或最优目标。那么,我们可以根据这个策略,每次得到局部最优解答,逐
步而推导出问题,这种策略称为贪心法。下面我们看一些简单例题。
【例1】在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个
数的和最大。
【算法分析】
要使总和最大,则每个数要尽可能大,自然应该选每行中最大的那个数。因此,
我们设计出如下算法:
读入N, M,矩阵数据;
Total = 0;
for (int I = 1; I <= N; ++ l)
{
//对N行进行选择
选择第I行最大的数,记为K;
Total += K;
}
输出最大总和Total;
从上例中我们可以看出,和递推法相仿,贪心法也是从问题的某一个初始解出发,
情况b:不按上述约束条件,直接选择a和b。可以得到价值80+100=180, 卡车装载的重量为40+50=90。没有超过卡车的实际载重,因此也是一种可行 解,显然,这种解比上一种解要优化。
问题出现在什么地方呢?我们看看图23
从图23中明显可以看出,情况a,卡车的空载率比情况b高。也就是说,上 面的分析,只考虑了货物的价值质量比,而没有考虑到卡车的运营效率,因此, 局部的最优化,不能导致全局的最优化。
因此,贪心不能简单进行,而需要全面的考虑,最后得到证明。
【例3】排队打水问题
有N个人排队到R个水龙头去打水,他们装满水桶的时间为T1,T2,…,Tn为整数且 各不相等,应如何安排他们的打水顺序才能使他们花费的时间最少?
【算法分析】
由于排队时,越靠前面的计算的次数越多,显然越小的排在越前面得出的结果越小
相关文档
最新文档