NYOJ 部分和问题

来源:互联网 发布:java实现web服务器 编辑:程序博客网 时间:2024/06/07 21:33

部分和问题

题目描述

给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。

输入

首先,n和k,n表示数的个数,k表示数的和。接着一行n个数。(1<=n<=20,保证不超int范围)

输出

如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”

样例输入

复制
4 131 2 4 7

样例输出

复制
YES2 4 7

提示

来源

nyoj


代码:

#include<stdio.h>#include<string.h>#include<stack>#include<algorithm>using namespace std;int a[105],n,k,i;stack<int>s;   //用栈来存数,因为dfs中的数据是反着的,恩。。我也讲不清,自己理解一下吧bool dfs(int i,int sum){    if(i==n)return sum==k;  //找到最后一个数字,判断    if(dfs(i+1,sum)) return 1;     if(dfs(i+1,sum+a[i]))    {        s.push(a[i]);  //把加上的数字存入栈中        return 1;    }    return 0;}int main(){    while(~scanf("%d%d",&n,&k))    {        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        if(dfs(0,0))        {            printf("YES\n");            while(!s.empty())            {                int x=s.top();                printf("%d ",x);                s.pop();            }            printf("\n");        }        else printf("NO\n");    }    return 0;}

代码2:

#include<stdio.h>#include<string.h>#include<stack>#include<algorithm>using namespace std;int a[105],n,k,i;stack<int>s;   //用栈来存数,因为dfs中的数据是反着的,恩。。我也讲不清,自己理解一下吧bool dfs(int i,int sum){    if(sum>k) return 0;    if(i==n)return sum==k;  //找到最后一个数字,判断    if(dfs(i+1,sum)) return 1;    if(dfs(i+1,sum+a[i]))    {        s.push(a[i]);  //把加上的数字存入栈中        return 1;    }    return 0;}int main(){    while(~scanf("%d%d",&n,&k))    {        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        if(dfs(0,0))        {            printf("YES\n");            while(!s.empty())            {                int x=s.top();                printf("%d ",x);                s.pop();            }            printf("\n");        }        else printf("NO\n");    }    return 0;}


原创粉丝点击