1. 何为贪心算法
贪心算法又称贪婪算法,是指在对问题求解时,总是做出在当前步骤看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。
2. 贪心算法的特点
- 贪心策略的选择只跟当前有关,跟前面的状态没有关系;
- 贪心算法通过迭代把总问题分解为若干个子问题,通过求解子问题,然后把子问题最优解合成总问题的最优解;
- 贪心算法可以归结为每次求最大值(最小值)
3. 汽车加油问题
问题描述
一辆汽车加满油一次可以跑300公里,现该车在第一个加油站出发时加满油,然后需要陆续经过间隔为[150,180,120,100,280,160]的加油站,指出在哪些油站加油,可以加油次数最少,算出加油次数。
意即该汽车一次最多跑300公里,第一次在起点加满油,途径的加油站间隔为[150,180,120,100,280,160],求加油最少次数。
图解
代码实现
def oil(n,distance):
i=1 #起始站加油算第一次
count=0 #当前站与下一站的距离
for one in distance:
count+=one #试着继续累加公里数,尽量跑最长距离
if n<count: #加满油开始持续跑,超过当前加油距离累加公里数
print('%d公里开始处加油'%(one))#累加距离等于或超过一次跑最长距离,要加油了
count=one #加满油,从新开始累计跑的距离
i+=1 #计加油次数
return i
n=300
dis=[150,180,120,100,280,160] #要求距离间隔都小于n,否则汽车中途要抛锚了
#dis=[150,60,50,180,120,100,280,160]
num=oil(n,dis)
print('该车最少要加油%d次'%(num))
结果:
小结
- 加满油每跑一次都算出最长可跑的距离,最后把所有加油次数累加,求得最少加油次数;
- 每加油跑一次求局部最长值,累计加油跑了多少次,就可以求得跑完路程的局部最优解,满足贪心算法的思路;
- 该算法直接给出了加油站之间的距离,并保证了加油站之间的距离都小于汽车一次加满油跑的距离,否则该算法会存在与事实不符问题(汽车容易没油,半路抛锚)。