部分和问题
-
描述
- 给定整数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
#include<stack> #include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,k,s[25],vis[25],flag,f[25],l; struct node { int num,sum; }; void dfs(node t,int pos) { //printf("%d %d\n",t.num,t.sum); if(t.sum==k) { flag=1; printf("YES\n"); for(int i=0;i<l;i++) printf("%d ",f[i]); printf("\n"); return; } for(int i=pos+1;i<=n;i++) { node p; p.num=s[i]; p.sum=t.sum+s[i]; f[l++]=s[i]; dfs(p,i); l--; if(flag==1) return; } return; } int main() { int i; while(scanf("%d%d",&n,&k)!=EOF) { memset(vis,0,sizeof(vis)); flag=0; for(i=1;i<=n;i++) scanf("%d",&s[i]); for(i=1;i<=n;i++) { node t; t.num=s[i]; t.sum=s[i]; vis[i]=1; f[0]=s[i]; l=1; dfs(t,i); } if(flag==0) printf("NO\n"); } return 0; }
- 首先,n和k,n表示数的个数,k表示数的和。
246

被折叠的 条评论
为什么被折叠?



