NYOJ1058 部分和问题

来源:互联网 发布:网络黄金egd还有希望吗 编辑:程序博客网 时间:2024/06/14 07:34

部分和问题

时间限制: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 <iostream>

#include<cstring>

using namespace std;

int a[25];

int visit[25];

int n,k;

int sum;

bool dfs(int p){

    if(sum==k){

        return true;

    }

    for(int i=p;i<n;i++){

        if((sum+a[i])<=k){

            visit[i]=1;

            sum += a[i];

            if(dfs(i+1)){

                return true;

            }

            sum -= a[i];

            visit[i]=0;

        }

    }

    return false;

    

}

int main(int argc, const char * argv[]) {

    

    while(cin>>n>>k){

        sum=0;

        memset(visit, 0, sizeof(visit));

        for(int i=0;i<n;i++){

            cin>>a[i];

        }

        

        if(dfs(0)){

            cout<<"YES"<<endl;

            for(int i=0;i<n;i++){

                if(visit[i]==1){

                    cout<<a[i]<<" ";

                }

            }

            cout<<endl;

        }

        else cout<<"NO"<<endl;

    }

    

    return 0;

}

这是一道简单的dfs问题,较为简单,在这里不做过多解释
时间8  内存240
原创粉丝点击