给一个硬币面值列表和一个找零数额,计算最少用几枚硬币找零。
def recMC(coin_values, change):
min_coins = change
# 如果在列表里,直接找这个就行了,所以是1枚
if change in coin_values:
return 1
else:
# 面值比change大的硬币就不用看了
for i in [c for c in coin_values if c <= change]:
num = 1 + recMC(coin_values, change - i)
if num < min_coins:
min_coins = num
return min_coins
def recMC2(coin_values, change, min_coins):
for cents in range(change + 1):
coin_cnt = cents
for i in [c for c in coin_values if c <= cents]:
if min_coins[cents - i] + 1 < coin_cnt:
coin_cnt = min_coins[cents - i] + 1
min_coins[cents] = coin_cnt
return min_coins[change]
if __name__ == "__main__":
print(recMC2([1, 5, 10, 25], 63, [0]*64))
# 6
recMC()是很慢的,因为中间计算的计算结果没有保存,所以要重复计算。改进的recMC2()就是加了一个数组存储中间结果,index是目标金额。
之后补背包问题。