题目描述
给定 n 个正整数:a1,a2,,⋯,an,请从中找出一些数字,使得它们的和恰好等于一个给定的目标 t。
输入格式
第一行:两个正整数 n 与 t。
第二行:n 个正整数 a_1,a_2,⋯,an。
输出格式
若能满足条件输出 Yes
,否则输出 No
。
2+3+5==10, 4+6==10,
之前看到一个子集和(四)的题目,觉得好难,发现这一系列题目由简单变难,很有意思,所以全都挑出来好好看看。
使用回溯法,回溯法”主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
其中体现了搜索中,枚举的思路。其核心就是 for 循环里面的递归,在递归调用之前「做选择 pick」,在递归调用之后「撤销选择 give」(这样可以返回全部满足条件的解答)
def dfs(pos,s):
print('s',s)
if pos==n-1:
return s==t
pick =dfs(pos+1,s+a[pos])
give =dfs(pos+1,s)
return pick or give
if dfs(0,0)==1:
print('yes')
else:
print('no')
这道题的模板性质比较强,但是内部每次递归之后的情况挺绕的,,我搞不清。反正就是牢记找结果,没找到就撤到上一步,继续找其它的结果吧。