NYOJ-1058- 部分和问题(DFS)

来源:互联网 发布:优胜网络在线教育 编辑:程序博客网 时间:2024/06/01 07:54

部分和问题
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
给定整数a1、a2、…….an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 13
1 2 4 7
样例输出
YES
2 4 7

这道题用DFS来做,用DFS来找多个数的部分和,大于返回,等于退出,小于继续(这道题在输出没让我们考虑行末尾是否有空格)
代码如下

#include <cstdio>#include <cstring>long long m;int i[22];int flag=0;int j[22];int num;int n;void dfs(int x,int sum){    if(flag)        return ;    if(sum>m)        return ;    else if(sum==m)    {        flag=1;        return ;    }    for(int a = x; a <n; a ++)    {        sum+=i[a];        j[num]=i[a];        num++;        dfs(a+1,sum);        if(flag)            return ;        sum-=i[a];        num--;    }}int main(){    while(scanf("%d%lld",&n,&m)!=EOF)    {        flag=0;        num=0;        for(int a = 0; a < n; a ++)            scanf("%d",&i[a]);        int k;        dfs(0,0);        if(!flag)            printf("NO\n");        else        {            printf("YES\n");            for(int a =0; a < num; a ++)                printf(a==num-1?"%d\n":"%d ",j[a]);        }    }    return 0;}
原创粉丝点击