补给站最优花费问题|青训营笔记

67 阅读3分钟

问题描述

小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