python寻找假硬币_捡拾硬币 【动态规划】【python】

这篇博客探讨了如何使用动态规划解决寻找假硬币的问题,不允许拾取相邻的硬币以获得最大面值。文章中展示了动态规划的实现过程,通过创建table数组并更新最大值。此外,还介绍了Python中列表逆序输出的方法。最后,提供了回溯函数以确定选择的硬币序列。
摘要由CSDN通过智能技术生成

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

动态规划

对于第i个硬币,

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

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

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

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

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

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

7a26e59bcb98fcd1601584feec608e4e.png

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

2cd186a7a8b556486c7adcd657d87ccf.png

#求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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值