贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

贪婪算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准。然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量攻欢什。如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。这种能够得到某种量度意义下最优解的走配分级处理方法称为贪婪算法。

对于一个给定的问题,往往可能有好几种量度标准。初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。

一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。最优解可称以通过一系列局部最优的选择即贪婪选择来今哥读绿支修科亲模空策达到,根据当前状态做出在当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子预了川问题。每做一次贪婪选择就将所求问题简化为一个规模精含根精更小的子问题,最终可得到问题的一个整体最优解。

贪婪算法可解决的问题通常大部分都有如下的特性:

⑴有一个以最优方式年飞接基客英来解决的问题。为了构造布建采劳转久统问题的解决方案,有一个候选的对象的集合:比如不同面值的硬币。

⑵随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。

⑶有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。

⑷还有一个函数检要树逐信门针则或念州罪查是否一个候选对象的集合是引可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方早法的最优性。

⑸选择函数可以指此迫给料变后或作岁过出哪一个剩余的候选对象最有希望构成问题的解。

⑹最后,目标函数给出解的值。

为了解决问转式从题,需要寻找一个构成解的候选对象集合,它可以优化目标过夫专衡但函数,贪婪算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢终将势弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。如果贪婪算法正确工作,那么找到的第一个解通常是最优的。

⒈建立数学模型来描述问题。

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

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

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

从问题的某一初始解出发;

while能朝给定总目标前进一步do

求出可行解的一个解元素括土势刻热究连正去首力;

下面是一个可以试用贪心算法解的题目,贪心解的确不错副联济思断型染消赵远继,可惜不是最优解。

[0-1背包问题]有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。

放交娘点厚毫进要求尽可能让装入背包中真粮术初直齐杆的物品总价值最大,但不能超过总容量。

物品ABCDEFG

重量35306050401兰算职厚的伤025

价值10403050354030

分析:

目标函数:∑pi最大

约束条件是装入的关田善物品总重量不超过背包容量:∑wi<=M(M=150)

⑴根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优

⑵每次挑选所占重量最小的物品装入是否能得到最优解

⑶每次选取单位重量价值最大的物品,成为解本题的策略。

值得注意的是,贪心算法并不是完全不可以使用,贪缩心策略一旦经过证明成立后,它就是一种高效的算法。

贪心算法还是很常见的算法之一,这是由于它简单易行,构造害甲弱展交尔队贪心策略不是很困难。

南冲调独础阻甲离应可惜的是,它需要证明定小后才能真正运用到题目的算法中。

一般来说,贪心算法的则比均问绿往断证明围绕着:整个问题的最优解一定由在贪优晶值置稳道造查离似心策略中存在的子问题的最优解得世密交创来的。

对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:

⑴贪心策略:选取价值最大者。

反例:

W=30

物品:ABC

加沿连极镇似永重量:281212

价值:302020

根据策略,首先选取物品A,接下厚跟结还请迅态款换来就无法再选取了,可是,选取B、C则更好。

⑵贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。

⑶贪心策略:选取单位重量价值最大的物品。

重量:282010

价值:282010

根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。

生理【注意:如果物品可以分割为任意大小,那么策略3可得最优解】

对于选本六每歌八永取单位重量价值最大的物品这个策略,可以再加一条优化的规则:对于单位重量价值一样的,则优先选择重量小的!这样,上面的反例就解决了。

但是,如果题目是如下所示,这个策略就也不行了。

W=40

重量:252015

价值:影紧击征组或映演首端252015

附:本题是个DP问题,用贪心法并不一定可以求得最优解,以后了解了动态规划算法后本题就有了队新的解法。

贪心法的应用算法有Dijkstra的单源最短路径和Chvatal的贪心集合覆盖启发式

马踏棋盘的贪心算法

123041-23XX

【问题描述】

马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条最短路径。

【初步设计】

⒈输入初始位置坐标x,y;

⒉步骤c:

如果c>64输出一个解,返回上一步骤c--

(x,y)←c

计算(x,y)的八个方位的子结点,选出那此可行的子结点

循环遍历所有可行子结点,步骤c++重复2

显然⑵是一个递归调用的过程,大致如下:

#defineN8

……

voiddfs(intx,inty,intcount)

{

inti,tx,ty;

if(count>N*N)

output_solution();//输出一个解

return;

}

for(I=0;i<8;++i)

tx=hn.x;//hn[]保存八个方位子结点

ty=hn.y;

s[tx][ty]=count;

dfs(tx,ty,count+1);//递归调用

s[tx][ty]=0;

Pascal程序:

ProgramYS;

ConstFXx:array[1..8]of-2..2=(1,2,2,1,-1,-2,-2,-1);

FXy:array[1..8]of-2..2=(2,1,-1,-2,-2,-1,1,2);

Var

Road:array[1..10,1..10]ofinteger;

x,y,x1,y1,total:integer;

ProcedureFind(x,y:integer);

varNx,Ny,i:integer;

Begin

Fori:=1to8dobegin{8个方向}

If(x+FXxin[1..8])and(y+FXyin[1..8])Then{确定新坐标是否越界}

IfRoad[x+Fxx,y+Fxy]=0Thenbegin{判断是否走过}

Nx:=x+FXx;Ny:=y+FXy;Road[Nx,Ny]:=1;{建立新坐标}

If(Nx=x1)and(Ny=y1)Theninc(total)

elseFind(Nx,Ny);{递归}

Road[Nx,Ny]:=0{回朔}

end

End;

BEGIN{Main}

Total:=0;

FillChar(Road,sizeof(road),0);

Readln(x,y);{读入开始坐标}

Readln(x1,y1);{读入结束坐标}

If(x>10)or(y>10)or(x1>10)or(y1>10)Thenwriteln('Eorror'){判断是否越界}

ElseFind(x,y);

Writeln('Total:',total){打出总数}

END.

怎么才能快速地得到部分解呢

【贪心算法】

如把3/7和13/23分别化为三个单位分数的和

设a、b为互质正整数,a

步骤一:用b除以a,得商数q1及余数r1。(r1=b-a*q1)

步骤二:把a/b记作:a/b=1/(q1+1)+(a-r)/b(q1+1)

步骤三:重复步骤2,直到分解完毕

3/7=1/3+2/21=1/3+1/11+1/231

13/23=1/2+3/46=1/2+1/16+1/368

设某个真分数的分子为a,分母为b;

把b除以a的商部分加1后的值作为埃及分数的某一个分母c;

将a乘以c再减去b,作为新的a;

将b乘以c,得到新的b;

如果a大于1且能整除b,则最后一个分母为b/a;算法结束;

或者,如果a等于1,则,最后一个分母为b;算法结束;

否则重复上面的步骤。

备注:事实上,后面判断a是否大于1和a是否等于1的两个判断可以合在一起,及判断b%a是否等于0,最后一个分母为b/a,显然是正确的。

THE END
1.贪心算法实例详解(转)Kobe10原文地址:http://blog.csdn.net/qq_32400847/article/details/51336300 这篇帖子总结归纳很到位,值得学习。 分类: 数据结构和算法 好文要顶 关注我 收藏该文 微信分享 Kobe10 粉丝- 27 关注- 25 +加关注 0 0 升级成为会员 ? 上一篇: 贪心算法(转) ? 下一篇: (贪心)加油站绕圈问题 https://www.cnblogs.com/Kobe10/p/6349135.html
2.数学模型数学模型-贪心算法及实例.ppt,贪心算法 问题引入: 有下面几种面值的硬币:一元、五角、一角、五分、一分,假设要付给顾客2.89元的零钱,要求用最少的硬币。 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某https://max.book118.com/html/2019/0814/6040151111002054.shtm
3.贪心算法教程:入门到实践的简洁指南贪心算法的应用实例与案例分析 背包问题 背包问题是一个经典的优化问题,涉及到决定哪些物品放入背包以最大化其总价值,同时不超过背包的重量限制。贪心算法可以用于解决“完全背包问题”,通过按价值/重量的比例排序物品并逐个加入背包,直到无法再加入为止。 示例代码: https://www.imooc.com/article/351183
4.贪心算法入门详解,经典实例分析贪心算法入门详解,经典实例分析 贪心算法的字面有本是形容人的“贪心”一词,着实有些引人注目,有人说贪心算法是世界上最简单的算法,原因很简单:所有人都很“贪心”,根本不用学,不过,算法会怎样贪心呢? “贪心”的人,事事都想要得到眼前最好的那个,看不到长远的东西,也不为将来最终结果做打算,换句话说,就是https://blog.popkx.com/2307/
5.采用C++实现区间图着色问题(贪心算法)实例详解IT知识教程采用C++实现区间图着色问题(贪心算法)实例详解 本文所述算法即假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有活动。采用C++的贪心算法,来确定哪一个活动使用哪一间教室。 对于这个问题也常被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色数最少。https://www.300.cn/itzspd/503783.html
6.算法详解(卷3)——贪心算法和动态规划在本系列图书的卷1中,我们看到了这个算法范例的很多实例:MergeSort和QuickSort算法、Karatsuba的O(n1.59)时间级的两个n位整数相乘算法、Strassen的O(n2.71)时间级的两个n×n矩阵的相乘算法等。 本系列图书卷3的前半部分讨论贪心算法的设计范例。贪心算法的准确定义是什么?关于这个问题,可以说是“唾沫和墨汁横飞”https://www.epubit.com/bookDetails?id=UB831756653320d
7.贪心算法:使用贪心算法实现哈夫曼编码为什么这里贪心算法得不到最优解呢?我们第一步从S->A和第一步从S->B,下一步面对的顶点和边是不一样的。也就是我们前面的选择会影响后面的选择,所以得不出最优解。 2、贪心算法实例分析 接下来,我们再看几个能够使用贪心算法求最优解的问题。 https://www.jianshu.com/p/9caa72f4ac97
8.力扣入门经典题型题目之贪心算法例子和解法:3个孩子饥饿程度为1,2,3,两块饼干大小为1,1。先分给饥饿程度最小的孩子,剩下1块,无法分给更多人了,结果为1. 贪心策略为先将两个数组排序,为了让尽可能多的吃饱 先喂饱饥饿度小的孩子最小的饼干,以此类推。 代码: C++ classSolution{public:intfindContentChildren(vector<int>&children,vector<https://zhuanlan.zhihu.com/p/451744848
9.浅谈Python实现贪心算法与活动安排问题python本篇文章主要介绍了浅谈Python实现贪心算法与活动安排问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 贪心算法 原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得https://www.jb51.net/article/130987.htm
10.Java实现贪心算法实例介绍51CTO博客Java 实现贪心算法实例介绍 1.引言 本文将介绍如何用 Java 实现贪心算法。 2.贪心问题 通常一个数学问题会有几种解法。可以迭代解决,也可以用分治法(快速排序算法)或者动态规划(背包问题)这样的高级方法。 大多数情况我们都在寻找最优解,但可悲的是并非每次都能得到期望的结果。某些情况下,即使是次优解也很有用https://blog.51cto.com/u_15127686/2829966
11.贪心算法WOODENSTICKS实例代码贪心算法 WOODEN STICKS 实例代码,需要的朋友可以参考一下 贪心算法 WOODEN STICKS2020-09-05 上传大小:37KB 所需:18积分/C币 用贪心算法解单源最短路径问题 用贪心算法解单源最短路径问题 明确单源最短路径问题的概念;利用贪心算法解决单源最短路径问题;并通过本例熟悉贪心算法在程序设计中的应用方法。 https://www.iteye.com/resource/weixin_38720756-12814957
12.使用贪心算法的分数背包问题Mangs使用贪心算法的分数背包问题 目录:- 一、简介 应用实例 三、算法说明 实施 推论/结论 简介:- 分数背包问题是一个组合优化问题。这意味着它涉及到 n 个在数学意义上具有不同特征(或权重和值)的对象。目标是将这些物品分成几个不同大小的背包,同时最大限度地提高总效用。在这个问题中,总效用由比率值/重量表示,https://devpress.csdn.net/python/62fb8e2a7e6682346618f099.html
13.算法分析与设计期末答案2023秋51.关于Prim算法和Dijkstra算法,以下说法正确的是( )。A:两个算法都需要引入一个数组用于记录一个点是否被访问过 B:两个算法在不优化时的时间复杂度都为O(V^2),V表示顶点的个数 C:两个算法都是贪心算法的经典实例 D:两个算法都包含了松弛操作,在松弛时对相应的数据结构进行更新 内容已经隐藏,点击付费后https://www.wkebb.com/c/776b56604264529595bfd59c2f472142.html
14.贪心算法WOODENSTICKS实例代码贪心算法 WOODEN STICKS 实例代码 Problem Description There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to https://www.xiuzhanwang.com/a1/Cyuyan/4505.html
15.C++算法集锦(14):贪心算法腾讯云开发者社区贪心算法可以理解为一种特殊的动态规划为题,拥有一些更加特殊的性质,可以进一步降低动态规划算法的时间复杂度。 来看几道题目熟悉一下这种“不断寻求局部最优”的算法。 跳跃游戏 I 输入一个非负整数数组nums,数组元素nums[i]表示的是:如果你站在位置 i ,最多能够往前跳几步。 现在你站在第一个位置nums[0],试https://cloud.tencent.com/developer/article/1879118
16.贪心算法(C语言实现)C语言贪心算法适用的问题:局部最优策略能产生全局最优解。但是实际上,贪心算法适用的情况很少。一般来说,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际实例进行分析,就可做出判断。 C语言贪心算法的一般步骤如下。 建立数学模型来描述问题。 https://www.54benniao.com/a/vts0zi.html