贪心算法(1)---简介

1.什么是贪心算法?(贪婪+鼠目寸光)

与其说是贪心算法,不如说是**贪心策略:**这是一种解决问题的策略,该策略的思路就是

"局部最优---->全局最优",具体步骤如下:

{

1.把解决问题的步骤分为若干步;

2.解决每一步的时候,都选择当前看起来"最优的"解法;

3."希望"全局达到最优解

}

例1:找零问题

已知我们只有面额【20,10,5,1】的纸币,要想用最少的张数来找够钱数46

(贪心思路:1.把该问题拆解为找一张张纸币的问题,要求找钱张数最少,就要找钱面额比较大;2.给他找第一张,选取局部最优的20,第二张局部最优20,第三张局部最优5,第四张局部最优1;3.正好满足加起来是46,达到全局最优解)

例2:最小路径和

|---|---|---|
| 1 | 3 | 1 |
| 1 | 7 | 1 |
| 6 | 1 | 1 |

题意:只能向下或者向右走,求从左上角到右下角的最优路径(即所走方框中的数和最小的路径)

贪心策略:从1开始,向下走(1+1)-->向下走(1+1+6)-->向右走(1+1+6+1)-->向右走(1+1+6+1+1)【每一步都是选择局部最优解,当然本题只是为了加深贪心策略的想法】

例3:背包问题

|-------|----|---|---|
| | 1 | 2 | 3 |
| V(体积) | 5 | 4 | 1 |
| W(价值) | 10 | 7 | 1 |

题意:背包的最大容量(体积)为8,目前有1,2,3三种种类的商品,他们的数量都是无限的,问如何装物品才能保证在不突破背包最大容量的情况下,装去最大价值的商品? 贪心策略1:只考虑体积作为限制条件,疯狂装体积小的商品,装的商品越多,价值就会越高;

贪心策略2:只考虑价格作为限制条件,先装一个1号物品,发现2号商品装不下,再装三个3号;

贪心策略3:将W/V作为限制条件,表示单位体积的商品的价值(1:2;2:1.75;3:1)按这个比值去决定装商品的顺序,先装一个1号物品,发现2号商品装不下,再装三个3号;

2.贪心算法的特点

2.1贪心策略的提出

  1. 贪心策略的提出是没有标准和模板的(有的根据常识经验,有的根据题意,有的可以根据多个条件)
  2. 可能每一道题的贪心策略都是不同的;

2.2贪心策略的正确性

因为有可能"贪心策略"是错误的方法(正如上述的例2和例3),正确的贪心策略是需要证明的;

常用的证明方法:数学中见过的所有证明方法

证明:找零问题

【20(A),10(B),5(C),1(D)】

以B为例,当B>2时,只要有两个B就可以用一个A代替;当B=2时,两个B可以用一个A来代替,所以要使用B达到最优策略,就必须B的数量<2;C也同理,C的数量<2;D也同理,D的数量<5;

因此,最优解的性质:B<=1;C<=1;d<=4;---->这样一来,BCD最多能凑的钱是19(10+5+4);

贪心:【a,b,c,d】: 能用a解决的就用a解决,

最优解:【A,B,C,D】结合BCD{MAX}=19,故A也是能用A解决就用A解决,所以A=a;

同理可以推导b=B,C=c,D=d;

3.学习贪心的方向

1.心态放平,遇到不会的贪心题目很正常

2.前期学习时把重点放在贪心策略上,当成经验吸收掉;(不要去深究为什么会这样想,为什么是对的,只是当成经验和知识吸收掉,能够用到下次题目中即可)

3.学有余力再去思考如何去证明

相关推荐
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan4 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy5 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息5 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳7 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊8 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥8 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao8 小时前
算法34,位运算符操作,总结
算法
Navigator_Z8 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z9 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode