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);
		}
	}
}

  

posted @ 2015-07-08 10:30  Chapter  阅读(183)  评论(0编辑  收藏  举报