C. 部分和问题

来源:互联网 发布:赛诺市场数据 9月 编辑:程序博客网 时间:2024/05/11 12:34
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。

Input

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

Output

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

Sample Input

4 131 2 4 7

Sample Output

YES

2 4 7

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int a[22],b[22],n,k;bool dfs(int x,int sum)//x代表步数{    if(sum>k)        return false;    if(x==n)        return sum==k;    if(dfs(x+1,sum))//不能加上a[x];    {        b[x]=0;        return true;    }    if(dfs(x+1,sum+a[x]))//能加上a[x];    {        b[x]=1;        return true;    }}int main(){    while(~scanf("%d%d",&n,&k))    {        memset(b,0,sizeof(b));        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);        }        if(dfs(0,0))//搜索开始        {            printf("YES\n");            for(int i=0; i<n; i++)            {                if(b[i])                    printf("%d ",a[i]);            }            printf("\n");        }        else            printf("NO\n");    }    return 0;}

ps:建议用code blocks 的watchs认真看看


0 0
原创粉丝点击