zoukankan      html  css  js  c++  java
  • 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
    给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
    Input
    第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9)
    第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)
    Output
    如果可以,输出:"Yes",否则输出"No"。
    Input示例
    5 13
    2
    4
    6
    8
    10
    Output示例
    No

    题解:

    使用dfs暴搜!

    #include <iostream> 
    #include <cstdio> 
    using namespace std; 
    const int maxn = 22; 
    
    int n, flag; 
    long long m, sum, num[maxn], s[maxn]; 
    
    void dfs(int pt, long long t){
    	if(flag){ return; }
    	if(t == m){
    		flag = 1; 
    		return; 
    	}
    	if(t > m){
    		return; 
    	}
    	if(t + (s[n-1]-s[pt]) < m){
    		return; 
    	}
    	if(pt+1 < n){
    		dfs(pt+1, t+num[pt+1]); 
    		dfs(pt+1, t); 
    	}
    }
    
    int main(){
    	freopen("in.txt", "r", stdin); 
    
    	while(scanf("%d %lld", &n, &m) != EOF){
    		sum = 0; 
    		for(int i=0; i<n; ++i) {
    			scanf("%lld", &num[i]); 
    			sum += num[i]; 
    			if(i == 0){
    				s[0] = num[i]; 
    			} else {
    				s[i] = s[i-1] + num[i];  
    			}
    		}
    		if(sum < m){
    			printf("No
    ");
    		}else{
    			flag = 0; 
    			dfs(0, num[0]); 
    			dfs(0, 0); 
    			if(flag){
    				printf("Yes
    ");
    			}else{
    				printf("No
    ");
    			}
    		}
    	}
    	return 0; 
    }
    

      

  • 相关阅读:
    准备ing
    六月的最后一星期
    对象及其内存管理 笔记
    数组及其内存管理 笔记
    笔记
    搜狐 云端服务组实习面试小记
    leetcode之Binary Tree Level Order Traversal
    数据库01-范式总结
    Tour UVa 1347 (DAG)
    Directed Acyclic Graph DAG(有向无环图)上的DP
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6069962.html
Copyright © 2011-2022 走看看