深搜专题10:组合
描述 已知一个一维数组a[1..n](n<20),又已知一整数m。如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO。 输入描述 输入包括两行,第一行包含两个整数n m(1<=n<20,1<=m<=1000000),第二行输入n个整数(每个数不会超过1000000)。 输出描述 如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO。
用例输入 1
6 5
2 3 1 4 2 1
用例输出 1
YES
类似《专题3 素数圈》,为一维的深搜,比较简单。
#include <bits/stdc++.h>
using namespace std;
int a[30],n,m,flag;
void dfs(int sum,int x){
if(sum==m){//和相等就标记
flag=1;
return;
}
for(int i=x+1;i<=n;i++){
if(sum+a[i]<=m){
sum+=a[i];//累加
dfs(sum,i);
sum-=a[i];//回溯
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(0,0);
if(flag)cout<<"YES";
else cout<<"NO";
return 0;
}