上海市计算机学会-子集和(回溯法)

题目描述

给定 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')

这道题的模板性质比较强,但是内部每次递归之后的情况挺绕的,,我搞不清。反正就是牢记找结果,没找到就撤到上一步,继续找其它的结果吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xy404chef

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值