关于回溯法【python】
最近遇到这么一个题目,给定一个数字集合a,和一个目标值t,找到集合a中所有和为t的数字组合,一个数字,可以多次出现。(集合和t都为正整数)例子:输入[2,3,6,7],t=7输出:[[7],[2,2,3]]#!/usr/bin/env pythoncandidate=[2,5,1]list=[]result=[]def search(candidates,target,list):...
·
最近遇到这么一个题目,给定一个数字集合a,和一个目标值t,找到集合a中所有和为t的数字组合,一个数字,可以多次出现。(集合和t都为正整数)
例子:
输入[2,3,6,7],t=7
输出:[[7],[2,2,3]]
#!/usr/bin/env python
candidate=[2,5,1]
list=[]
result=[]
def search(candidates,target,list):
if (sum(list)==target)://回溯点
list.sort()
if list not in result:
result.append(list)
return
if (sum(list)>target):
return
for i in range(len(candidate)):
search(candidates,target,list+[candidates[i]])
search(candidate,7,list)
print(result)
其基本思想是回溯法
回溯法是暴力法的升级版本,问题的解决是一步一步向下进行的,而每一步又会有有限个选项步,则可以构建一棵多叉树,每个根节点如果匹配则进入该节点的子节点,继续向下匹配,匹配失败则回到父节点的其他子节点向下匹配,如果父节点的所有节点都无法向下匹配成功,则回溯到父节点的父节点,访问爷爷节点的其他字节点,这个过程可以由递归来实现,也就可以用栈来实现和理解。我们便利所有的元素,让其成为入口,也就是根节点,这个时候根节点的方法入栈,如果根节点匹配了,继续向根节点的子节点访问,根节点的子节点的方法入栈,如果该根节的子节点都无法匹配,则该子节点出栈,回溯根节点的其他子节点,继续。如果完全匹配,则返回成功。如果完全便利,都没能匹配,则返回失败。
更多推荐
已为社区贡献1条内容
所有评论(0)