【发布时间】:2018-06-12 01:37:04
【问题描述】:
我知道有很多关于这个挑战的话题,但在标记为重复之前,请继续阅读。
在给定硬币列表的情况下,需要找到所有不同的方法来找零。 我写了一个有效的递归解决方案,但效率很低。我想添加备忘录。我知道还有其他方法(例如here)来解决它,但是为了我对事情如何运作的理解,我正在寻求您的帮助来解决我在 my 解决方案中发现的问题。
首先,代码如下:
d = {}
def make_change(n, coins):
print n
# base case
if n < 0:
print 'Nope'
print '_'*40
return 0
if n == 0:
print 'yay'
print '_'*40
return 1
if n in d:
return d[n]
else:
c = 0
for i in coins:
print 'i = ', i
c += make_change(n-i, [c for c in coins if c<=i]) # https://stackoverflow.com/a/33425875/5056689
d[n] = c
return c
make_change(20, [5,10])
这会返回 2 个解,打印语句显示解是 (5,5,5,5) 和 (10,10)。第三种可能的解决方案 (10,5,5) 不包括在内,因为 10 已经在键中。
那么,我如何在不实际跟踪所有解决方案的情况下,用 unique 方式达到某个目标的数量来保存字典,这会破坏目的。
感谢您的帮助。
【问题讨论】:
标签: python algorithm recursion dynamic-programming