zoukankan      html  css  js  c++  java
  • Solution 21: 子集和问题

    问题描述

    输入两个整数n和m,从数列1,2,3,...,n中随意取出几个数。

    使其和等于m,把所有符合的组合列出来。

    解决思路

    dfs,注意:

    1. 一个元素只能使用一次;

    2. 保证输出的集合不重复。

    程序

    public class SubsetSum {
    	public List<List<Integer>> getSubset(int n, int m) {
    		List<List<Integer>> res = new ArrayList<List<Integer>>();
    
    		if (n <= 0 || m <= 0 || m > n * (n + 1) / 2) {
    			return res;
    		}
    
    		int[] nums = new int[n];
    		for (int i = 0; i < nums.length; i++) {
    			nums[i] = i + 1;
    		}
    		
    		List<Integer> sol = new ArrayList<Integer>();
    		helper(res, sol, nums, m, 0);
    		return res;
    	}
    
    	private void helper(List<List<Integer>> res, List<Integer> sol, int[] nums, int m, int start) {
    		if (m < 0) {
    			return ;
    		}
    		if (m == 0) {
    			res.add(new ArrayList<Integer>(sol));
    			return;
    		}
    		
    		for (int i = start; i < nums.length; i++) {
    			if (sol.contains(nums[i])) {
    				continue;
    			}
    			sol.add(nums[i]);
    			helper(res, sol, nums, m - nums[i], i + 1);
    			sol.remove(sol.size() - 1);
    		}
    	}
    }
    

      

  • 相关阅读:
    HTML5学习记录
    CSS学习记录
    HTML扩展(thead,tbody,tfoot标签的使用)
    测删除功能
    jmeter-连接数据库
    jmeter-正则表达式提取器
    jmeter常用函数
    java基础(二)
    git基本使用
    波特的钻石模型
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4629449.html
Copyright © 2011-2022 走看看