什么是计算受阈值约束的成本的有效方法

时间:2014-06-30 09:35:47

标签: python

我想计算受特定门槛限制的家庭用水费用: 基本上,阈值如下:

  • 对于前0-10 m3,它将花费10美元
  • 随后的11-20立方米将花费20美元
  • 随后的21-30立方米将花费30美元
  • 对于随后的> 30立方米,它将花费40美元

例如,如果一个家庭使用40立方米的水,将收取费用:

(10*10) + (10*20) + (10*30) + (10*40) = $1000

如果一个家庭使用23立方米的水,将收取费用:

(10*10) + (10*20) + (3*30) = $390

我能想到的唯一方法就是使用if-conditionals。我不认为这是计算这个的最好方法。

2 个答案:

答案 0 :(得分:2)

你也可以使用字典:

dic = {0:(0,10), 1:(100,20), 2:(300,30), 3:(600,40)}

然后你只需要一次if语句。

def costs(vol):
    interval = vol/10 # vol must be positive int
    if interval in dic:
        price = dic[interval]
        return price[0] + price[1]*(vol-price[1] + 10)
    else:
        return dic[3][0] + dic[3][1]*(vol-dic[3][1] + 10)

您可以使用成本函数是分段线性的这一事实。因此,您必须找出您所处的时间间隔,并将其用作字典的关键字,在此处您可以节省每个间隔开始时的成本以及成本的增加。

答案 1 :(得分:0)

首先定义一个列表,该列表将以(difference in volume, price)格式保存这些限制:

lst = [(10, 10), (10, 20), (10, 30), (None, 40)]

请注意,订单很重要。这里None代表“无限制”。现在功能:

def get_money(volume):
    if volume <= 0:
        return 0

    total = 0
    for diff, price in lst:
        if volume == 0:
            break

        if diff is None:
            total += volume * price
            volume = 0
        elif volume > diff:
            total += diff * price
            volume -= diff
        else:
            total += volume * price
            volume = 0

    return total

BTW:如果不使用if,就无法解决这个问题。 :)