假设有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])