部分和问题
时间限制: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;
}