这是典型的计数更改问题。我几次尝试将其翻译成表格解决方案,直到发现另一个人的特定翻译很奇怪。
def first_denomination(kinds):
x=[50,20,10,5,1]#erroneous for the given DP code
#x=[1,5,10,20,50] #works with DP
return x[kinds-1]
def cc(amt,kinds): #either order of x gets cc(100,5)= 343
if amt==0:
return 1
elif amt<0 or kinds==0:
return 0
else:
return cc(amt,kinds-1)+cc(amt-first_denomination(kinds),kinds)
def dp_cc (amount , kinds_of_coins ): #must put coins in ascending order to get 343
row = [1]*( kinds_of_coins )
table = []
for i in range ( amount +1):
table . append (list(row))
for j in range(kinds_of_coins):
table[0][j]=1
for i in range (1, amount +1):
for j in range (1, kinds_of_coins ):
d = first_denomination ( kinds_of_coins -j+1)
if i >=d:
table [i][j] = table [i][j-1] + table [i-d][j]
else :
table [i][j] = table [i][j-1]
return table [ amount ][ kinds_of_coins -1]
这里的问题是,如果我按硬币的降序排列x,我会得到dp_cc(100,5)=8061
,这很奇怪,而只有升序实现才获得dp_cc(100,5)=343
。我已经尝试了适用于这两种情况的其他实现,但是我不确定为什么这种特殊方法不起作用,因为顺序在这些问题中无关紧要。谁能启发我为什么?