从零开始学习贪心算法(greedy algorithm,又称贪婪算法)

一、什么是贪心算法?


  贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

1、贪心算法是解决问题的策略,由局部最优推出全局最优,称贪心算法为贪心策略更为形象。

      1)把解决问题的过程分为若干步;

      2)解决每一步的时候,都选择当前看起来"最优的"接解法(最能体现贪心的);

      3)"希望"得到全局最优。

2、解决问题的步骤

1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。

3、贪心算法每一步必须满足

  1、可行的:即它必须满足问题的约束。

  2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。

  3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。

 

4、贪心算法的特点

  1. 贪心策略的提出是没有标准以及模版的
  2. 可能每道题的贪心策略都是不同的     
  3. 贪心策略的正确性不确定(正确的贪心策略是需要证明的)                                                                                                                   

常用的证明方法:数学中见过的所有证明方法 

总结: 

   贪心算法适用于一些特定类型的问题,通常要求问题具有贪心选择性质(即每一步的选择都是最优的),以及最优子结构性质(即问题的最优解可以通过子问题的最优解推导得出)。然而,贪心算法不一定能够求解所有问题,有些问题可能需要更复杂的算法来解决。

  经典的贪心算法问题有找零钱问题、活动选择问题、背包问题中的部分背包等。贪心算法在求解这些问题时,通常能够得到接近最优解的结果,但并不保证一定能够得到全局最优解。

  总之,贪心算法是一种基于每一步的局部最优选择来求解问题的思想,适用于一些满足贪心选择性质和最优子结构性质的问题

二、贪心算法举例


1、找零问题

     每次找零钱的时候都选择此时面额最大的那一张 ,因为选择最大的,用最少的张数能够快速凑够所需的钱数。

2、最小路径和

  给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

**说明:**每次只能向下或者向右移动一步。

131
171
611

3、背包问题

  在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。这时便可以使用贪心算法求解了。计算每种物品的单位重量价值作为贪心选择的依据指标,选择单位重量价值最高的物品,将尽可能多的该物品装入背包,依此策略一直地进行下去,直到背包装满为止。

  在零一背包问题中贪心选择之所以不能得到最优解原因是:贪心选择无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值