nyoj1058 部分和问题

来源:互联网 发布:mac电脑如何装双系统 编辑:程序博客网 时间:2024/06/06 03:16


部分和问题

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

#include<stdio.h>#include<string.h>#include<stack>using namespace std;int a[21];int b[21];int n,k;stack<int>p;bool dfs(int i,int sum){if(i==n+1){if(sum==k) return true;return false;}if(dfs(i+1,sum)) return true;if(dfs(i+1,sum+a[i])){p.push(a[i]);return true;} }int main(){while(~scanf("%d%d",&n,&k)){//memset()for(int i=1;i<=n;i++)scanf("%d",&a[i]);if(dfs(1,0)){printf("YES\n");while(!p.empty()){printf("%d ",p.top());p.pop();}printf("\n");}else printf("NO\n");}return 0;}

第二种

#include<stdio.h>#include<string.h>#include<stack>using namespace std;int a[21];int b[21];int n,k,sum;int flag;stack<int>p;void dfs(int x){if(sum==k){flag=0;printf("YES\n");for(int i=1;i<=n;i++)if(b[i]) printf("%d ",a[i]); printf("\n"); return ;}for(int i=x;i<=n;i++){sum+=a[i];b[i]=1;dfs(i+1);b[i]=0;sum-=a[i];} }int main(){while(~scanf("%d%d",&n,&k)){sum=0;flag=1;memset(b,0,sizeof(b));for(int i=1;i<=n;i++)scanf("%d",&a[i]);dfs(1);if(flag)printf("NO\n");}return 0;}