子集和
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定 n 个整数:a1,a2,⋯,an,请从中找出一些数字,使得它们的和恰好等于一个给定的目标 t。
输入格式
第一行:两个整数 n 与 t。
第二行:n 个整数 a1,a2,⋯,an。
输出格式
若能满足条件输出 Yes
,否则输出 No
。
数据范围
1≤n≤20
1≤t≤10^8
1≤ai≤10^8
样例数据
输入:
5 10
2 3 4 5 6
输出:
Yes
解析:深度优先搜索,时间复杂度O(2^N),详见代码:
#include <bits/stdc++.h>
using namespace std;
int n,t;
int a[25];
bool flag=0;//默认没有
void dfs(int step,int sum){
if (flag==1) return;
if (sum==t){
flag=1;
return;
}
if (step>n) return;
dfs(step+1,sum+a[step]);
dfs(step+1,sum);
}
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,0);
if (flag==1){
cout<<"Yes";
}else{
cout<<"No";
}
return 0;
}