解法
这个有意思,01背包的省空间方法需要从大到小遍历容量
而这个与一个物品可以取无数次的背包相似的问题,恰恰是正好要从小到大遍历
因为容量较小的[j]会先被访问到,假设它只能装一个coins[i],那么更新完毕之后f[j]的种类数就由两部分组成:(1)只使用前i-1种硬币(2)使用一个i硬币
而f[j+coins[i]]将会在后面被遍历到,它未处理之前只包含(1)只使用前i-1种硬币,加上f[j]之后自然就包含两个新的数目:(2)使用一个i硬币【在f[j]的第一部分再加一个i硬币】;(3)使用两个i硬币【在f[j]的第二部分再加一个i硬币】
这样省去了三重循环
class Solution(object):
def change(self, amount, coins):
"""
:type amount: int
:type coins: List[int]
:rtype: int
"""
f = [0]*(amount+1)
f[0] = 1
n = len(coins)
for i in xrange(n):
for j in xrange(coins[i], amount+1):
f[j] += f[j-coins[i]]
return f[amount]
476

被折叠的 条评论
为什么被折叠?



