でお金を変えるここにお金の問題を変えるための2つのプログラムがあります。最初のものはすべての組み合わせを取得する唯一の再帰プログラムで、もう1つは動的プログラミングを使用しています。しかし、私が第二のものに取り組んでいるとき、私は困ってしまいます。最初のものより速いと思われますが、私のプログラムはそれを実行するためにずっと動いています。ダイナミックプログラミングを使用していると確信していますが、何が問題なのか分かりません。Python動的プログラミング
注:合計は、変更される予定の金額です。単位は、異なる値のリストであり、ステップの値を格納する辞書です。
まず:
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],{}))
単位の数字は、整数であり、降順であると仮定されている。 – Eleanor
文字列を構築するのではなく、dictキーのタプルを使用するだけです。 –
@TomKarzesしかし、それは私が推測する時間がかかりませんか? – Eleanor