一、什么是贪心算法?
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
1、贪心算法是解决问题的策略,由局部最优推出全局最优,称贪心算法为贪心策略更为形象。
1)把解决问题的过程分为若干步;
2)解决每一步的时候,都选择当前看起来"最优的"接解法(最能体现贪心的);
3)"希望"得到全局最优。
2、解决问题的步骤
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
3、贪心算法每一步必须满足
1、可行的:即它必须满足问题的约束。
2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。
4、贪心算法的特点
- 贪心策略的提出是没有标准以及模版的
- 可能每道题的贪心策略都是不同的
- 贪心策略的正确性不确定(正确的贪心策略是需要证明的)
常用的证明方法:数学中见过的所有证明方法
总结:
贪心算法适用于一些特定类型的问题,通常要求问题具有贪心选择性质(即每一步的选择都是最优的),以及最优子结构性质(即问题的最优解可以通过子问题的最优解推导得出)。然而,贪心算法不一定能够求解所有问题,有些问题可能需要更复杂的算法来解决。
经典的贪心算法问题有找零钱问题、活动选择问题、背包问题中的部分背包等。贪心算法在求解这些问题时,通常能够得到接近最优解的结果,但并不保证一定能够得到全局最优解。
总之,贪心算法是一种基于每一步的局部最优选择来求解问题的思想,适用于一些满足贪心选择性质和最优子结构性质的问题。
二、贪心算法举例
1、找零问题
每次找零钱的时候都选择此时面额最大的那一张 ,因为选择最大的,用最少的张数能够快速凑够所需的钱数。
2、最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
**说明:**每次只能向下或者向右移动一步。
1 | 3 | 1 |
1 | 7 | 1 |
6 | 1 | 1 |
3、背包问题
在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。这时便可以使用贪心算法求解了。计算每种物品的单位重量价值作为贪心选择的依据指标,选择单位重量价值最高的物品,将尽可能多的该物品装入背包,依此策略一直地进行下去,直到背包装满为止。
在零一背包问题中贪心选择之所以不能得到最优解原因是:贪心选择无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。