和为K的组合 51Nod

来源:互联网 发布:湖北侦破网络传销 编辑:程序博客网 时间:2024/06/05 18:12
给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
Input
第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9) 
第2 - N + 1行:每行1个数,对应数组的元素Aii (1 <= Aii <= 10^6)
Output
如果可以,输出:"Yes",否则输出"No"。
Sample Input
5 13246810
Sample Output
No
思路:这个题和我以前做过的题很相似,一个较为简单的深搜题,不过普通的深搜
加标记会超时,我们可以这样思考:这一堆数字我们已经知道总和sum(可以求
出),那么在搜索时,我们可以判断两次,搜索的出的总和cont,和sum-cont,这样就可以大大减少时间和复杂度,不用使用标记,因为在暴力搜索(两种选择,加
入,还是不加入)是把所有可能都遍历一遍。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 20+10int 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;}


原创粉丝点击