zoukankan      html  css  js  c++  java
  • 部分和问题 南阳oj 1058

    部分和问题

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

    输入
    首先,n和k,n表示数的个数,k表示数的和。
    接着一行n个数。
    (1<=n<=20,保证不超int范围)
    输出
    如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
    样例输入
    4 13
    1 2 4 7
    样例输出
    YES
    2 4 7

    简单递归 

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,m,k,a[22],b,h;
    int c[22];
    int sum;
    void bfs(int l)
    {
        if(sum>m)//当单次循环的结果大于m时 循环就没再进行下去的必要了
            return ;
        else if(sum==m)//输出
        {
            if(b==0)
            {
                cout<<"YES"<<endl;
                b=1;
            }
            for(int i=0;i<n;i++)
                if(c[i]==1)
                    cout<<a[i]<<" ";
            cout<<endl;
            h=1;
            return ;
        }
        else{
            for(int i=l;i<n;i++)//递归核心  
            {//画图模拟  只动脑 不动手 是不行的
                sum+=a[i];
                c[i]=1;
                bfs(i+1);
                sum-=a[i];
                c[i]=0;
            }
        }
    }
    int main()
    {
        while(cin>>n>>m)
        {
            memset(a,0,sizeof(a));
            int sum1=0,sum=0;
            b=0;
            h=0;
            for(int i=0;i<n;i++)
            {
                cin>>a[i];
                sum1+=a[i];
            }
            memset(c,0,sizeof(c));
            if(sum1<m)//如果所有数的和 都没m大 结果是肯定的
                cout<<"NO"<<endl;
            else
            {
                 bfs(0);
                if(h==0)  //递归完没有合适的解
                    cout<<"NO"<<endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    可运行的Java RMI示例和踩坑总结
    JS异步与同步
    Github作为Maven仓库
    Jmeter笔记
    nodeJS生成xlsx以及设置样式
    double运算的坑
    mysql零散操作
    go包的理解
    nodeJS 服务端文件上传
    webpack+thymeleaf实现数据直出
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900178.html
Copyright © 2011-2022 走看看