计数变化动态编程:硬币顺序重要吗?

时间:2018-06-20 01:21:03

标签: python python-3.x recursion dynamic-programming

这是典型的计数更改问题。我几次尝试将其翻译成表格解决方案,直到发现另一个人的特定翻译很奇怪。

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。我已经尝试了适用于这两种情况的其他实现,但是我不确定为什么这种特殊方法不起作用,因为顺序在这些问题中无关紧要。谁能启发我为什么?

0 个答案:

没有答案