一、贪心算法的概念
贪心算法的实质:每一阶段得到局部最优,最终结果达到全局最优。
例如,有一堆钞票,我们可以从中拿走十张,问怎样使拿到的钞票总金额最大?
这题的思路很清楚,我们如果每次都拿最大金额的钞票,那么,最终肯定是拿走了最大数额的钱。
在这题中,每次拿最大的就是局部最优,最后拿走最大数额的钱就是达到全局最优。
再比如,对于背包问题,如果有一堆物品,你有一个背包体积为N,现在问我们要如何把背包尽可能装满,并且使得最终背包内所有物品的总价值最大。
可能我们会想到,每次去选所占体积最小的物品。的确,这样可以能够保证我们装入物品的数量最多,但是所有物品的总价值不一定是最大的。
这时候就需要用到动态规划了。
具体求解方法请浏览:动态规划之背包问题篇_PL_涵的博客-优快云博客
二、如何验证贪心是否可行?
可能我们在刷一些类型是贪心算法的题目的时候,根本想不出来题目怎么与贪心相联系了,所以经常有人问有没有什么套路可以一看就看出来是贪心,但是贪心算法并没有固定的套路。
换句话说,贪心算法更像是一种思想。
所以在碰到此类题目的时候,最大的难点就是怎么去实现通过局部最优推出整体最优的过程。
那么如何看出局部最优是否能推出整体最优呢?
这就需要靠我们自己手动去模拟一些情况,如果模拟可行,就可以试一试贪心策略。
那么我们如何验证可不可以用贪心算法呢?最好的方法就是举反例,手动模拟的时候,感觉可以通过局部最优推出整体最优,而且想不到反例,那么就试一试贪心。
如果贪心的思路不可行,那么可能就需要动态规划或者一些其他的方法了。
所以这也是为什么我们AC了一些贪心算法的题目,但也不知道自己用了贪心算法,因为贪心有时候就是一些常识的知识,所以我们会认为本来就是这么做的。
三、贪心解题步骤
贪心算法的解题思路一般可分为以下四步:
1. 将问题分解为若干个子问题
2. 找出适合的贪心策略
3. 求解每一个子问题的最优解
4. 将局部最优解堆叠成全局最优解
其实这样算分的较细了,而我们真正刷题的时候,很难分出这么详细的解题步骤,因为有时候可能贪心的题目往往还和其他方面的知识混在一起。