部分和问题升级版

来源:互联网 发布:常见的网络进攻形式 编辑:程序博客网 时间:2024/05/29 09:42
//当有多组数据满足的情况下就输出第一组///当出现负数的情况也应该要考虑///特殊情况当k=0也应当考虑清楚
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>using namespace std;int a[25];int flag[25];int n,k,sum;int ok,cc,pp;void dfs(int x){    pp++;//当k为0时保证循环不会直接退出    if(ok==1)//保证只输出一组解        return;    if(sum>=k&&pp>1)    {        if(sum==k)        {            for(int i=0;i<=n;i++)//判断一下k为0的情况            {                if(flag[i]==1)                {                    cc=1;                    break;                }            }            if(cc==1)            {                ok=1;//证明是有解的                cout<<"YES"<<endl;                for(int i=0;i<n;i++)                {                    if(flag[i]==1)                    {                        cout<<a[i]<<" ";                    }                }                cout<<endl;            }            return;        }    }    for(int i=x;i<n;i++)    {        sum += a[i];        flag[i]=1;        dfs(i+1);        sum -= a[i];        flag[i]=0;    }}int main(){    while(cin>>n>>k)//n表示数的个数,k表示数的和    {        memset(flag,0,sizeof(flag));        ok=0;        cc=0;        pp=0;        sum=0;        for(int i=0;i<n;i++)        cin>>a[i];        dfs(0);        if(ok==0)        {            cout<<"NO"<<endl;        }    }    return 0;}
4 131 2 4 7
样例输出
YES2 4 7

1 0
原创粉丝点击