zoukankan      html  css  js  c++  java
  • [NYOJ] 1058 部分和问题

    [NYOJ] 1058 部分和问题

    P1058

    部分和问题
    时间限制: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

    感觉是深搜题,先写了一个TLE的

    #include<cstdio>
    using namespace std;
    
    int a[25],n,k,c[25];
    bool b[25],flag;
    
    
    bool dfs(int dp,int sum) {/!!
        if(dp>n) return 0;
        if(flag) return 0;
        int i;
        for(i=1; i<=n; i++) {/!!
            if(!b[i]) {
                sum+=a[i];
                b[i]=1;
                if(sum==k) {
                    flag=1;
                    printf("YES\n");
                    for(int i=1; i<=n; i++) {
                        if(b[i]) printf("%d ",a[i]);
    
                    }
                } else {
                    dfs(dp+1,sum);/!!
                }
                b[i]=0;
                sum-=a[i];
            }
        }
        return 1;
    }
    
    
    int main() {
        while(~scanf("%d %d",&n,&k)) {
            for(int i=1; i<=n; i++) {
                scanf("%d",&a[i]);
            }
            dfs(1,0);//!!
            if(!flag) printf("NO\n");
            flag=0;
        }
        return 0;
    }

    最开始写的是cin cout
    加了cin.sync_with_stdio(false); cin.tie(0); 依然TLE
    改成scanf printf 还是TLE
    难受

    注释的叹号是错误的地方
    稍加改动

    #include<cstdio>
    using namespace std;
    
    int a[25],n,k,c[25];
    bool b[25],flag;
    
    
    bool dfs(int dp,int sum,int pre) {
        if(dp>n) return 0;
        if(flag) return 0;
        int i; 
        for(i=pre+1; i<=n; i++) {
            if(!b[i]) {
                sum+=a[i];
                b[i]=1;
                if(sum==k) {
                    flag=1;
                    printf("YES\n");
                    for(int i=1; i<=n; i++) {
                        if(b[i]) printf("%d ",a[i]);
    
                    }
                } else {
                    dfs(dp+1,sum,i);
                }
                b[i]=0;
                sum-=a[i];
            }
        }
        return 1;
    }
    
    
    int main() {
        while(~scanf("%d %d",&n,&k)) {
            for(int i=1; i<=n; i++) {
                scanf("%d",&a[i]);
            }
            dfs(1,0,0);
            if(!flag) printf("NO\n");
            flag=0;
        }
        return 0;
    }
    
    
    

    Pre真好用

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247554.html

  • 相关阅读:
    java-mybaits-00503-延迟加载
    java-mybaits-00502-案例-映射分析-一对一、一对多、多对多
    java-mybaits-00501-案例-映射分析-订单商品数据模型
    java-mybaits-00402-Mapper-动态sql-if、where、foreach、sql片段
    数据结构与算法实验题7.1 M 商人的求救
    HDOJ 1075
    HDOJ 1856
    HDOJ 3790
    HDOJ 1869
    HDOJ 1870
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247554.html
Copyright © 2011-2022 走看看