从过去几个小时开始,我一直在尝试调试此代码。
问题:给定一组硬币:1,5,10,21和25写一个算法,使用尽可能少的硬币找到给定金额的变化。
例如:如果金额为63,则应返回3 [21,21,21]
我的代码:
def change_rec_memo(change_list, amount, memo):
if amount in change_list:
memo[amount] = (1, [amount])
return 1, [amount]
if amount in memo:
return memo[amount]
mini, values, min_coin = None, [], None
for coin in change_list:
if amount - coin > 0:
count, sub_values = change_rec_memo(change_list, amount-coin, memo)
if mini is None:
mini = count
values = sub_values
min_coin = coin
if count < mini:
mini = count
values = sub_values
min_coin = coin
values.append(min_coin)
memo[amount] = (mini+1, values)
return mini+1, values
def main():
print change_rec_memo([1, 5, 10, 21, 25], 52, {})
对于大多数情况,代码似乎工作正常,但对于像52,63这样的情况则失败。它输出正确数量的硬币,但coin_listing包含额外的硬币。
这是一个Python小提琴:https://pyfiddle.io/fiddle/08b3da45-0c0d-464a-b025-00d215bc4634/?i=true
答案 0 :(得分:0)
还有一个更可读和更简短的例子。并使用堆栈变量(递归函数的参数)
import sys
@functools.lru_cache()
def change_rec_memo(change_list, amount, count):
if amount == 0:
return count
if len(change_list) == 0 or amount < 0:return sys.maxsize
if amount - change_list[-1] >= 0:
return min(change_rec_memo(change_list,amount - change_list[-1], count +1),change_rec_memo(change_list[:-1], amount, count))
else:
return change_rec_memo(change_list[:-1], amount, count)
print(change_rec_memo((1, 5, 10, 21, 25), 215,0))