【发布时间】:2018-04-13 07:18:14
【问题描述】:
这里有两个解决零钱问题的程序。第一个只是一个获得所有组合的递归程序,第二个是使用动态编程。但是,当我在做第二个时,我遇到了麻烦。它应该比第一个更快,但我的程序永远运行来做到这一点。我很确定我使用的是动态编程,但我不知道它有什么问题?
注意:Total 是要改变的钱,units 是一个具有不同值的列表,stored 是一个字典,用来存储一个步骤的值。
第一:
def changeMoney(total, units):
if ( total == 0 ):
return [{}]
elif ( total < 0 ):
return []
else:
n = len(units)
ret = []
for i in range(0,n):
sols = changeMoney(total-units[i],units[i:n])
for sol in sols:
if ( units[i] in sol ):
sol[units[i]] += 1
else:
sol[units[i]] = 1
ret.append(sol)
return ret
print(dpChangeMoney(300,[100,50,20,10,5,2,1],{}))
第二:
import copy
def dpChangeMoney(total, units, stored):
key = ".".join(map(str,[total] + units))
if key in stored:
return stored[key]
else:
if ( total == 0 ):
return [{}]
elif ( total < 0 ):
return []
else:
n = len(units)
for i in range(0,n):
sols = copy.deepcopy(dpChangeMoney(total-
units[i],units[i:n], stored))
for sol in sols:
if ( units[i] in sol ):
sol[units[i]] += 1
else:
sol[units[i]] = 1
if key in stored:
if sol not in stored[key]:
stored[key] += [sol]
else:
stored[key] = [sol]
return stored[key]
print(dpChangeMoney(300,[100,50,20,10,5,2,1],{}))
【问题讨论】:
-
单位中的数字假定为整数并按降序排列。
-
你应该只使用一个元组作为 dict 键,而不是构造一个字符串。
-
@TomKarzes 但我猜这不费时间?
-
正确,它的效率有点低,并且不必要地使代码复杂化,但它不会导致您的问题。
-
dp中的核心点是状态转移方程。在货币兑换中是
d[s]=min{d[s-v[i]]+1, d[s]}。你需要一个例子吗?
标签: python dynamic-programming