留下最少的小费

时间:2019-06-19 12:05:16

标签: python optimization loss

如果您需要用不同的硬币支付一定数量的钱,那么计算支付数量的确切硬币数量很简单,则可以使用以下方法:

for i, j in zip(coins, needed): 
         if amount >= 2*i: 
             j = amount // i 
             amount = amount - j * i 
             print (i ," : ", j)

这行得通,如果我需要支付98美元,并且我有50、10、5和1个硬币。

但是,如果我需要支付98,但是我没有100、50、20个硬币怎么办? (最佳解决方案是给出100,并损失2) 有没有简单的柏拉图式解决方法?还是我需要计算所有不同的变化,并寻找最小的损失?

1 个答案:

答案 0 :(得分:0)

@ h4z3谢谢

一种有效的解决方案是,如果有人知道一个较短/更好的版本,谢谢

d_amount = amount
x=0
while True:
    served_coins = []
    served_units = []
    for i, j in zip(coins, needed): 
         if d_amount >= i: 
             j = d_amount // i 
             d_amount = d_amount - j * i 
             served_coins.append(i)
             served_units.append(j)
    #print d_amount
    if (d_amount == 0):
        break
    else:
        x = x + 1
    d_amount = amount + x