问题描述
输入两个整数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);
}
}
}