贪心算法(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.学有余力再去思考如何去证明

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法