深搜-nyoj-部分和问题

来源:互联网 发布:360网络认证 编辑:程序博客网 时间:2024/06/05 10:24

部分和问题

描述
给定整数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<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;}

0 0
原创粉丝点击