虚拟汽车加油问题 —— 【算法设计】贪心法

贪心法

问题背景

一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
算法设计:
对于给定的n和k个加油站位置,计算最少加油次数。
数据输入:
n:表示汽车加满油后可行驶nkm
k:旅途中有k个加油站
k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。
第0个加油站表示出发地,汽车已加满油。
第k+1个加油站表示目的地。
数据输出:
最少加油次数和具体在哪几个加油站加油。


贪心算法
  • 基本思想
    贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择
    当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。
    在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

  • 基本要素

    • 贪心选择性:
      贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
      这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
    • 最优子结构:
      当一个问题的最优解包含其子问题的最优解时,称此问题具有最有子结构性质。
  • 基本步骤
    从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。


贪心算法下的虚拟汽车加油问题
思想

根据贪心选择性,截取当前位置到下一加油站区间,判断当前油量是否能够到达下一加油站,如果不能,在当前加油站加油;如果能,行驶至下一加油站。在截取的区间内做出判断,即选取局部做出最优判断。

过程
  1. 设置变量tmp_gas表示当前汽车油量可行驶公里数
  2. 判断到下一个加油站的距离是否大于tmp_gas
  3. 如果大于则继续前行,且当前油量可行驶公里数tmp_gas减去到下一个加油站的距离
  4. 否则在当前加油站加满油

贪心算法虚拟汽车加油-Python代码

本代码为python3下的贪心法虚拟汽车加油问题
关键步骤已标记注释

# coding : utf-8

# 计算汽车最少加油次数以及加油站点
def car_addgas(n,k,dist):
	tmp_gas = n
	station = [0]*k
	for i in range(len(dist)):
		if dist[i] < tmp_gas:
			tmp_gas-=dist[i]
		else :
			station[i-1]=1
			tmp_gas=n-dist[i]
	return station

# 读input.txt获取数据
with open('input.txt','r') as f:
	nk=f.readline().split()
	n = int(nk[0],10)
	k = int(nk[1],10)
	dist = list(map(int,f.readline().split()))
print("\n汽车加满油可行驶公里数:%d\n"%n)
print("旅途中的加油站个数:%d\n"%k)
print("各加油站间的公里数:\n")
print(dist)
print("\n---------------------- Solution ----------------------")

station = car_addgas(n,k,dist)

# 转换成加油站号
s=[]
for i in range(1,k+1):
	if i*station[i-1] !=0:
		s.append(i*station[i-1])
# print(s)
res=len(s)
# print(res)
print("\n汽车最少加油次数为%d"%res)
print("\n汽车加油分别所在的加油站为:\n")
print(s)

  • 测试运行
    虚拟汽车加油问题 —— 【算法设计】贪心法_第1张图片


分界线



**************************
Date2020/1/18           
Category:算法设计
AuthorVer.
**************************

你可能感兴趣的:(算法设计)