问题描述
小U计划进行一场从地点A到地点B的徒步旅行,旅行总共需要
M天。为了在旅途中确保安全,小U每天都需要消耗一份食物。在路程中,小U会经过一些补给站,这些补给站分布在不同的天数上,且每个补给站的食物价格各不相同。小U需要在这些补给站中购买食物,以确保每天都有足够的食物。现在她想知道,如何规划在不同补给站的购买策略,以使她能够花费最少的钱顺利完成这次旅行。
M:总路程所需的天数。N:路上补给站的数量。p:每个补给站的描述,包含两个数字A和B,表示第A天有一个补给站,并且该站每份食物的价格为B元。保证第0天一定有一个补给站,并且补给站是按顺序出现的。
分析题目
假设M = 5 ,N = 4 ,p = [[0, 2], [1, 3], [2, 1], [3, 2]]
题目规则分析
消耗:每天必须消耗一份食物,说明想走到某一天必须有足够的食物
补给:补给站可以补给食物,因为没有背包容量限制,所以理论上一个补给站可以买无限份补给。每个补给站的食物价格各不相同
题目要求分析
求出最优规划,以使她能花费最少的钱顺利完成旅行
由于没有背包容量限制,这一题就是一道经典的贪心算法问题,即通过局部最优解找到总体最优解。
通过p = [[0, 2], [1, 3], [2, 1], [3, 2]]这个例子来分析。
第0天时,补给站价格为2元,身上食物数量为0,目前花费为0元
根据消耗规则,如果我想走到第1天,我需要起码一份食物,所以我必须要购买一份食物,费用+2
第1天时,补给站价格为3元,目前花费为2元
如果选择在第1天买补给,费用+3,目前花费为5元
如果选择在第0天买补给,费用+2,目前花费为4元
由此可见在第0天买两份食物更优
第2天时,补给站价格为1元,目前花费为4元
如果在第2天买补给,费用+1,目前花费为5元
如果在第0天买补给,费用+2,目前花费为6元
由此可见在第2天买食物更优
第3天时,补给站价格为2元,目前花费为5元
如果在第3天买补给,费用+2,目前花费为7元
如果在第2天买补给,费用+1,目前花费为6元
由此可见在第2天买食物更优
代码实现
price=p[0][1] #设置一个补给站价格初值,即第0天时的补给站价格
day=p[0][0] #设置一个日期初值,为了记录目前碰到最便宜的补给站出现在哪一天
money=0 #总花费
for i in range(1,k):
money+=(p[i][0]-day)*price
if price>p[i][1]:
price=p[i][1]
day=p[i][0]
n-=day
money+=price*n
return money