贪心算法:
- 解决的问题:最优化问题
- 期望通过局部最优解得到全局最优解
每一步选择:当前最佳
证明有效,需要严格的数学证明
- 证明无效,只需找到一个反例
暴力搜素、动态规划、贪心 的区别:
- 搜索:遍历每一条可能的分支
- 动态规划:记忆化搜索,重叠子问题只计算一次
- 贪心:不解决所有可能的子问题,贪心地选择其中一个
动态规划就是暴力搜索加缓存(记忆化搜索),暴力搜素是自顶向下,动态规划是自低向上递推。
贪心是求局部最优,以得到全局最优(不一定是正确的,需要证明)
dp是通过一些状态来描述一些子问题,然后通过状态之间的转移来求解(一般只要转移方程是正确的,答案必然是正确的)
贪心法的基本要素:
1、贪心选择性质
指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。是贪心与动规的主要区别,在动态规划中,每步所作出的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。而在贪心算法中,仅在当前状态下作出最好的选择,即局部最优解,然后再去解 作出这个选择后产生的相应的子问题,贪心算法所作出的贪心选择不依赖于子问题的解。
2、最优子结构
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
0-1背包为何不能用贪心:
如:有3种物品,背包容量为50公斤。物品1重10公斤,价值60元;物品2重20公斤,价值100元;物品3重30公斤,价值120元。因此物品1每公斤价值6元,物品2每公斤价值5元,物品3每公斤价值4元。若依据贪心,首选物品1,背包剩40公斤,然后选物品2,背包剩20公斤,盛不下物品3了,总收益是160。而最优方案是选择物品2和物品3,得220元。所有0-1背包用贪心不能保证全局最优。
0-1背包问题不能用贪心,背包问题可以用贪心
因为0-1背包问题每次装单位重量价值最高的物品,无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。可能达不到全局最优解。
0-1背包可以用递归和动态规划做,详见:
https://blog.csdn.net/zxm1306192988/article/details/80582672
https://blog.csdn.net/zxm1306192988/article/details/80627205
凑成总金额所需的最少的硬币个数:
不能一定能用贪心
(1)有四种硬币:0.25;0.10,0.05,0.01 揍 0.63
贪心:2*0.25+1*0.1+3*0.01 所需硬币6个,是最少的方案
这种利用了硬币面值的特殊性
(2)有三种硬币:0.01,0.05,0.11 揍 0.15
贪心:1*0.11+4*0.01=0.15 所需硬币5个,但显然 3*0.05 只需3个。
凑最少硬币用动态规划:https://blog.csdn.net/zxm1306192988/article/details/80671599
所以贪心算法不能对所有问题都得到整体最优解。
但以下算法都用了贪心:
- 求最小生成树的普里姆算法和 克鲁斯卡尔算法
- 求单源最短路径的迪杰斯特拉算法
- 哈弗曼编码