zoukankan      html  css  js  c++  java
  • nyoj 1058部分和问题(DFS)

    部分和问题

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
     
    描述
    给定整数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<cstdio>
    #include<cstring>
    bool vis[22], ok;
    int a[22];
    int n, k;
    void dfs(int sum, int cur)
    {
        if(sum==k)
        {
            if(!ok)
            {
                ok = 1;
                printf("YES
    ");
            }
            for(int i=0; i<n; i++)
            if(vis[i])
            printf("%d ", a[i]);
            printf("
    ");
            return;
        }
        for(int i=cur; i<n; i++)
        {
            sum+=a[i];
            vis[i] = 1;
            dfs(sum, i+1);
            vis[i] = 0;
            sum-=a[i];
        }
    }
    
    int main()
    {
        while(scanf("%d%d", &n, &k)!=EOF)
        {
            for(int i=0; i<n; i++)
            scanf("%d", &a[i]);
            memset(vis, 0, sizeof(vis));
            ok = 0;
            dfs(0, 0);
            if(ok==0)
            printf("No
    ");
        }
        return 0;
    }

    此题有更优的解法-------01背包。

  • 相关阅读:
    HDU 4268 multiset
    ACM-线段树
    HDU 5014 异或之和
    HDU 5012 骰子旋转(DFS)
    HDU 5011 NIM博弈
    HDU 5007 字符串匹配
    Android-Context
    Android-视图绘制
    Android-LayoutInflater
    oracle--分页过程demo1
  • 原文地址:https://www.cnblogs.com/acm1314/p/4742601.html
Copyright © 2011-2022 走看看