【发布时间】:2016-10-25 07:20:08
【问题描述】:
考虑以下问题
给定无限数量的镍币(5 美分)和便士(1 美分)。编写代码计算表示 n 美分的多种方式。
我的代码
def coins(n):
if (n < 0):
return 0
elif (n == 0):
return 1
else:
if (cnt_lst[n-1] == 0):
cnt_lst[n-1] = coins(n-1) + coins(n-5)
return cnt_lst[n-1]
if __name__ == "__main__":
cnt = int(input())
cnt_lst = [0] * cnt #Memiozation
ret = coins(cnt)
print(ret)
以上方法计数重复模式不止一个(显然我没有明确检查它们)。
[5,1,1,1,1,1] [1,5,1,1,1,1] [1,1,5,1,1,1] 等
随着n 的增长,维护另一个包含先前看到的模式的列表将需要大量内存。我们可以使用什么其他方法来克服这个问题?
【问题讨论】:
-
如果 n= 便士总数,则 n= (n/5) 镍币 +(n%5) 美分。 = for i= 0 to (n/5), n= (n/5-i) + ((n%5) + (5*i)), 是否可以视为(n/5)+1种方式用镍和美分代表 n 美分。 (或) 如果 n= k 镍和 c 分,则 n=k-(i) + c + 5*i, i 从 0 到 k 变化,即 k+1 种表示 n 分的方式。这看起来很傻吗?
-
使用此算法无法进一步减少内存。但是,还有其他算法可以解决这个问题。
标签: python recursion dynamic-programming memoization