捡拾硬币 【动态规划】【python】

假设有n个硬币排在一行,要求不能拾取相邻的两个硬币,已获得累加面值最大的拾取子序列

动态规划 

对于第i个硬币,

1)拾取第i个硬币,则table[i-2]+c[i]

2)不拾取第i个硬币,则table[i-1]

取两者里边的最大值给了table[i]

(一直都没有给列表分配存储空间的习惯,以为python里边不需要来着)

补充一点列表逆序输出的知识:

list[::-1]    将列表list整个逆序输出

list[3::-1] 将下标为0~3的元素逆序输出


#求table
def coinamount(c):
    table=[None]*(len(c)+1)
    table[0]=0
    table[1]=c[0]
    for i in range(2,len(c)+1):
        table[i]=max(table[i-2]+c[i-1],table[i-1])
    return table

#回溯
def back(table,c):
    select=[]
    lent=len(table)-1
    i=lent
    while i>=1:
        if table[i]>table[i-1]:   #选最后一个
            select.append(c[i-1])
            i-=2
        else:
            i-=1
    return select
if __name__=="__main__":
    c=[5,1,2,10,6,2]
    temp=coinamount(c)
    select=back(temp,c)
    print("动态规划表:")
    print(temp)
    print(select[::-1])

    

 

你可能感兴趣的:(dp,python)