【发布时间】:2019-09-27 12:56:02
【问题描述】:
我正在尝试实现一个分而治之的程序,当给定硬币集 c = {c0, c1,...,cn} 和金额 A 时,它会找到可以支付 A 的多种不同方式,如以及函数被递归了多少次。
我的想法是做这样的事情:
callsMade = 0
coins = [1,5,10,25]
def makeChange(A, c):
global callsMade
callsMade += 1
if(A == 0):
return 1
if(A < 0):
return 0
combos = 0
for i in range(len(coins)):
combos += makeChange(A - coins[i], i)
return combos
其中 A 是传入的金额,c = len(coins)-1。 不过,这段代码的 sn-p 行为并不像我预期的那样。我的思考过程是循环遍历硬币数组,用数组中那个位置的硬币减去当前数量,然后递归调用 makeChange 函数,用较低的数量和数组中的下一个硬币,然后将全局调用每个增加 1时间。
使用硬币集 = [1,5,10,25] 和金额 A = 200,组合的数量应该是 1463,大约有 1500 次调用。
【问题讨论】:
-
我不清楚你在问什么。在中间你说这不能按预期工作。发生什么了?你需要什么帮助? (难道你还需要检查
coins[I]是否小于A? -
传入
c有什么意义?它没有被使用。 -
目前它给了我错误的组合数量,我什至不能用超过 50 的值调用它,因为程序慢到爬行。所以首先,我想帮助了解我对这个分而治之问题的思考过程是否正确,然后希望能在那个 sn-p 中找到我的错误。
-
@MisterMiyagi 正确。我的想法是用它来遍历硬币列表,并在进行另一个递归调用之前增加它。我很困惑如何将这一切结合在一起才能正常工作。