贪心算法概述
1.贪心算法概念
贪心算法是一种 “思想” ,即解决问题时从 “局部最优” 从而达到 “全局最优” 的效果。
- ①把解决问题的过程分为若干步
- ②解决每一步时候,都选择当前最优解(不关注全局)
- ③可能会得到全局最优解
示例:
- 例1:找零问题
例题:有[20,10,5,1]四种面值的纸币,请用最小的张数来凑出46元。(用√标识)
- 例2:最小路径和
例题:有下面九宫格,求从[0,0]到[2,2]最小路径和。(下面绿色的线为贪心算法线)
- 例3:背包问题
例题:现有容量为8的背包,请按下面的v(体积)-w(价值)表用背包装下最大价值的货物。(三种贪心策略,按体积来贪心(绿色)、按价值来贪心(红色)、按性价比来贪心(紫色))
2.贪心算法特点
- 贪心策略因题而异,变化多端。
- 贪心策略需要证明其正确性
- 贪心策略错误,举一反例,比如上面例二错误
- 贪心策略正确,用数学方法进行证明
上面三个例子中,只有例一是正确的,下面我们来证明其正确性:
现假设最优解用到每种面额的张数分别是**[A,B,C,D]**
如果B>=2,可用一张A(20元)进行替换,故最优解的B<=1,同理可知C<=1,D<=1
结论:对于最优解而言,B <=1; C <= 1; D <= 4;
我们继续假设我们贪心算法所得的结果分别用到每种面额的张树分别是**[a,b,c,d]**
由贪心策略尽可能的取20张面额的纸币可知,a >= A
同时,我们知道如果 a > A,那么对于最优解而言,这个少的20元纸币必须用后面的B、C、D来进行弥补(因为总钱数是一样的),但是(B + C + D)max = 10 + 5 + 4 = 19元。因而不能弥补少的20元,也就是说a 不可能大于 A,所以 a = A;
同理,我们可以推得b = B;c = C;d = D, 即 a = A,b = B;c = C;d = D
所以我们所用的贪心算法就是最优解。
3.贪心算法学习
前期多借鉴别人的思路,为什么这么想可以不用太关注。
证明因人而异,可以根据需要来是否对证明过程进行掌握。
EOF