[经典] 组合指定和问题
【Combination Sum I】
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7
and target 7
,
A solution set is: [7]
[2, 2, 3]
解法:先对数组进行排序,再用DFS。其中设定一个开始位,候选集中下一个数都只能取前一个数下标后面的数。
【Combination Sum II】
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
For example, given candidate set 10,1,2,7,6,1,5
and target 8
,
A solution set is: [1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
解法:由于要求每个数字不能重复,所以其它都一样,多了一个条件,候选集中下一个数不仅需要候选集中上一个数下标之后,并且两个相邻数的数值也不能相同。
【Combination Sum III】
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Ensure that numbers within the set are sorted in ascending order.
Example:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
解法:与第一题不同的是,指定了数目,数值范围;利用这一点,可以更早地剪枝。
假设需求数的个数为need,当前目标数是target,当前数值是i;那么不必到target < 0才回溯,只需要target < i*need+need*(need-1)/2或者target > need*9就可以回溯了,因为此时已经不可能满足要求。