我正在尝试实施硬币兑换问题,该问题指出
硬币兑换问题被描述为给定一个值 N,如果我们想用 N 美分找零,并且我们有无限供应 S = {S1, S2, . . . , Sm} 值钱的硬币,有多少种方法可以找零?硬币的顺序无关紧要。用贪心法确定所有可能改变 N 分的方法。例如,对于 N = 4 和 S = {1, 2, 3},有四种解:{1, 1, 1, 1}, {1, 1, 2}, {2, 2}, {1, 3}。所以输出应该是 4。对于 N = 10 和 S = {2, 5, 3, 6},有五种解决方案:{2, 2, 2, 2, 2}, {2, 2, 3, 3}, {2, 2, 6},{2, 3, 5} 和{5, 5}。所以输出应该是5。
注意:这不是原始的硬币更换问题,我们必须找到最佳解决方案(即最小硬币数量)
在我下面的 python 实现中,我使用了一个名为 $check$ 的列表名称。问题是程序在整个运行期间都使用相同的 $check$ 列表,因此我得到了错误的结果。它应该使用它的函数调用本地的 $check$ 列表。任何人都可以找到解决这个问题的方法吗..
# N
N = 10
# Set of Changes
s = [2, 3, 5, 6]
lst = []
check = [0, 0, 0, 0]
def Coin_Change_Count(C, check):
for k in range(len(s)):
i = len(s) - k - 1
t = C - s[i]
if (t >= 0):
if (s[i] == 2):
check[0] += 1
elif (s[i] == 3):
check[1] += 1
elif (s[i] == 5):
check[2] += 1
elif (s[i] == 6):
check[3] += 1
if (t >= s[0]):
Coin_Change_Count(t, check)
if (t == 0):
if (not (check in lst)):
lst.append(check)
Coin_Change_Count(N, check)
print(len(lst))