• Java实现 蓝桥杯VIP 算法训练 和为T


    问题描述
    从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
    输入格式
    第一行一个正整数n,表示整数集内元素的个数。
    第二行n个整数,用空格隔开。
    第三行一个整数T,表示要达到的和。
    输出格式
    输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
    若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
    最后一行输出总方案数。
    样例输入
    5
    -7 -3 -2 5 9
    0
    样例输出
    -3 -2 5
    -7 -2 9
    2
    数据规模和约定
    1<=n<=22
    T<=maxlongint
    集合中任意元素的和都不超过long的范围

    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.Scanner;
    import java.util.Stack;
    
    
    public class 和为T {
    	  public static void main(String[] args) {
    	        Scanner sc = new Scanner(System.in);
    	        n = sc.nextInt();
    	        isVisited = new boolean[n];
    	        nums = new int[n];
    	        for (int i = 0; i < n; i++) {
    	            nums[i] = sc.nextInt();
    	        }
    	        t = sc.nextInt();
    	        sc.close();
    	        dfs(n - 1, 0, new LinkedList(), true);
    	        while (!out.isEmpty()) {
    	            System.out.println(out.pop());
    	        }
    	        System.out.println(cnt);
    	    }
    	    
    	    private static int cnt = 0, n = 0, t = 0;
    	    private static boolean[] isVisited;
    	    private static int[] nums;
    	    private static Stack out = new Stack<Integer>();
    	    
    	    private static void dfs(int pos, int tempT, LinkedList selectedNums, boolean isNone) {
    	        for (int i = pos; i >= 0; i--) {
    	            if (!isVisited[i]) {
    	                isVisited[i] = true;
    	                selectedNums.push(nums[i]);
    	                dfs(i - 1, tempT + nums[i], selectedNums, false);
    	                selectedNums.pop();
    	                isVisited[i] = false;
    	            }
    	        }
    	        if (tempT == t && !isNone) {
    	            out.push(toReulstString(selectedNums.iterator()));
    	            cnt++;
    	        }
    	    }
    	    
    	    private static String toReulstString(Iterator it) {
    	        StringBuilder result = new StringBuilder();
    	        while (it.hasNext()) {
    	            result.append(it.next() + " ");
    	        }
    	        return result.toString();
    	    }
    
    }
    
    
  • 相关阅读:
    ruby之gem update --system 失败
    免费的视频资源
    java的数据类型
    函数parseQuery用于解析url查询参数
    使用闭包的方式实现一个累加函数 addNum
    正则表达式之捕获重用
    JavaScript正则表达式练习
    JavaScript的数组和字符串应用
    Sublime Text3.0的安装
    Oracle的集合运算符
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078678.html
Copyright © 2020-2023  润新知