贪心算法

Posted joezzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法相关的知识,希望对你有一定的参考价值。

贪心算法概念

  根据局部最优解得到问题的整体最优解或整体最优解的近似解:只根据当前已有信息做当前最优选择(且选择了就不能改变)

能利用贪心算法解决的问题有两个特性

  1.贪心选择

  原问题的整体最优解可以通过一系列局部最优选择得到

  2.最优子结构

  问题的最优解包含其子问题的最优解,比如:北京-广州的最短路径问题(必须经过上海),则北京-上海、上海-广州的最短路径是问题的子问题,这个问题的最优解就必须考虑子问题北京-上海、上海-广州的最短路径的最优解

使用贪心算法的步骤

  1.贪心策略

  确定贪心策略:选择当前看上去最优的方案

  2.局部最优解

  根据贪心策略,一步一步得到局部最优解

  3.整体最优解

  把所有的局部最优解合成原问题的最优解

简单例子1——最优装载问题

  问题描述:海盗船载重为C,每件宝贝的重量为wi,海盗如何把尽可能多的宝贝装上海盗船?

  贪心策略:每次选当前重量最轻的宝贝放上海盗船

  算法设计:1.对宝贝重量进行排序;sort()函数接收2个参数或者3个参数,可对数组或者vector排序,2个参数分别为首指针和尾后指针,第3个参数可以是一个谓词,头文件<algorithm>

       2.按照贪心策略每次选当前最轻的宝贝,直到海盗船装不下,设置计数器,最后计数器的值就是最后装入海盗船的宝贝数量

简单例子2——可分割的背包问题

  问题描述:背包载重为m,山洞中有n个宝贝,每个宝贝的重量为wi,价值为vi,单个宝贝可以分割,盗贼如何选择能使盗取的价值最大?

  贪心算法:因为单个宝贝可以分割,所以可以引入性价比,每次选当前性价比最高的宝贝放入背包

  算法设计:1.定义一个结构体,包含宝贝的重量、价值、性价比

       2.按照贪心策略每次选当前性价比最高的宝贝,直到背包装不下完整宝贝,此时,将性价比最高的那个宝贝进行分割,装入分割宝贝,使背包刚好装满

简单例子3——会议安排问题

  问题描述:如何在有限的时间内召开尽可能多的会议?

  贪心算法:因为最早开始时间+持续时间最短=最早结束时间,所以每次选当前来看结束时间最早且不会与已有会议相冲突的会议

  算法设计:1.定义一个结构体,包含会议的开始时间、结束时间

          2.对会议按结束时间排序

       3.按照贪心策略一步一步地选择会议,每安排上一个会议,便用变量last记录这个会议结束时间,下一次选择的会议的开始时间必须大于等于last

 

  

以上是关于贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

程序员算法基础——贪心算法

贪心思想

算法基础--贪心算法

贪心算法学习,附由贪心算法引发的人生感悟。

算法贪心算法(0-1背包问题)

python常用算法——贪心算法,欧几里得算法