【发布时间】:2016-02-02 00:21:05
【问题描述】:
我试图解决这个问题好几个小时,但我无法直观地思考它。对此有一种心理障碍。经过多次尝试,对于存在解决方案的情况,我能够得到正确的递归解决方案。所以我有以下问题:
递归程序正在为存在解决方案的输入提供正确的解决方案。如何在解决方案不存在的情况下返回“不存在解决方案”。 Ex for Coins [3,10],没有解决方案来改变 17。
DP 程序中的错误是什么?我尝试使用记忆技术创建字典并为其添加值,但程序无法正常运行。
import math
def findMinCoins(denomination, change):
#recursive solution
minCoins = change
if(len(denomination )== 0 or change ==0): #when there are no coins or change is 0
return 0
elif(change in denomination):
return 1
elif(change < min(denomination)):
return float("inf")
else:
for i in denomination:
if(i<=change):
numCoins = 1 + findMinCoins(denomination, change - i)
if(numCoins < minCoins):
minCoins = numCoins
return minCoins
c = [3,10]
d = 30
print findMinCoins(c,d)
现在是 DP 解决方案。
import math
coinsDict = {}
def findMinCoins(denomination, change):
minCoins = change
if(len(denomination )== 0 or change ==0):
return 0
elif(change in denomination):
return 1
elif(change < min(denomination)):
return float("inf")
else:
for i in denomination:
if (coinsDict.get(change)):
print 'dictionaty',change, coinsDict.get(change)
return coinsDict[change]
elif(i<=change):
numCoins = 1 + findMinCoins(denomination, change - i)
if(numCoins < minCoins):
minCoins = numCoins
print change, numCoins
coinsDict[change] = numCoins
return minCoins
c = [3,10]
d = 30
print findMinCoins(c,d)
【问题讨论】:
-
欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。 “无法正常工作”不是问题描述。显示您的输出和您运行的逻辑跟踪。
-
@Prune 在 DP 程序中输入硬币 = [3,10] 和零钱 = 30。输出是 10 个硬币,但应该是 3 个硬币,因为 [10,10,10] 是最小数字所需的硬币。我认为问题存在是因为我首先将硬币 3 添加到字典中。现在,当程序为硬币 10 递归调用自身时,它会检查是否存在特定更改的值。所以它也使用 3 的值来表示 10。
标签: python recursion dynamic-programming