贪心算法

Posted jettle

tags:

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

一.对贪心算法的理解

贪心算法所做的每个选择都是当前状态下最好的选择,可以依赖以往所做的选择,但不依赖将来做的选择,也不依赖子问题的解。它并不从整体最优上加以考虑,故贪心算法并不是总能得到整体最优解,但有些问题相比于动态规划算法,使用贪心算法会更简单且效率更高,比如找零钱问题等。

可以用贪心选择算法解决的问题一般有两个性质:贪心选择性质和最优子结构性质。贪心选择性质即每步所做的贪心选择最终导致问题的最优解;最优子结构性质即该问题的最优解包含其子问题的最优解。

运用贪心算法时最关键的是贪心策略的选择,比如会场安排问题,若只有一个会场要尽可能安排多的活动,则贪心策略是每次根据最早结束时间安排活动,若要安排尽可能少的会场来安排全部活动,则贪心策略是每次根据最早开始时间安排活动。所以贪心策略的选择很重要。

 

二.汽车加油问题的贪心选择性质

题目:一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。

输入:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。

输出:最少加油次数。如果无法到达目的地,则输出“No Solution!”。

贪心选择:若剩下的汽油足够行驶到下个加油站,则在该站不加油。

     |          |               |       |

     A         B             1      2

假设在A的前一个站加满油后汽车可一直行驶到B加油站,而到不了1,而在A加油可使汽车行驶到1,若此时1是终点站,则在A或B加油都可使汽车到达终点。若终点站在2处,在加油站A加油到不了2,在B加油可以到2,则根据贪心选择,为了让加油次数尽可能少,则应该在B站加油,即问题的最优解包含贪心选择,满足贪心选择性质。

 

三.贪心算法学习过程中遇到的问题及结对编程的情况

贪心算法比起动态规划稍微简单一点,只是有些题目贪心策略较难确定,贪心选择性质和最优子结构性质有点难证明。

这次结对编程一起完成了第一道题,但第二道题两个人的想法都错了,所以一直卡在第二道题,最终还是审题的问题,两个人对题目都理解错了。总的来说要多交流,多做题,多举反例。

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

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

贪心思想

算法基础--贪心算法

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

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

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