《programming for the puzzled》第18章
设计到的语言和算法知识:建立和查找字典,异常,在递归搜索中使用查表法。
问题描述:我们有一组硬币排成一排,每个硬币有一个正数值。我们需要挑选一个硬币的子集,使其和最大,但我们不能选择两个相邻的硬币。
如硬币为14,3,27,4,5,15,1,我们应该选择14,跳过3,选择27,跳过4和5,选择15,跳过1。总和为56。采用另外的选法得到的总和都小于56。
首先使用递归算法解决这个问题。我们选择不同的硬币,选择它或跳过它,当跳过一个硬币时,我们可以选择或跳过下一个硬币。如果我们选择一个硬币时,我们必须跳过下一个硬币。最后返回硬币数值之和。
1 | # 《programming for the puzzled》实操 |
现在用回溯法试试,看看table有啥用。
1 | def traceback(row, table): |
这里的table是上一个算法的输出结果。
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地