第2 - N + 1行:每行1个数,对应数组的元素A i i (1 <= A i i <= 10^6)
5 13 2 4 6 8 10
No
思路:这个题和我以前做过的题很相似,一个较为简单的深搜题,不过普通的深搜
加标记会超时,我们可以这样思考:这一堆数字我们已经知道总和sum(可以求
出),那么在搜索时,我们可以判断两次,搜索的出的总和cont,和sum-cont,这样就可以大大减少时间和复杂度,不用使用标记,因为在暴力搜索(两种选择,加
入,还是不加入)是把所有可能都遍历一遍。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 20+10 int num[maxn]; int book[maxn]; int n,m,flag,sum; void dfs(int cont,int s) { if(cont==m||sum-cont==m) { flag=1; return ; } if(flag||s>=n) return ; dfs(cont+num[s],s+1); dfs(cont,s+1); } int main() { while(~scanf("%d %d",&n,&m)) { sum=0; flag=0; for(int i=0; i<n; i++) { scanf("%d",&num[i]); sum+=num[i]; } dfs(0,0); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }