[经典] 组合指定和问题

【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就可以回溯了,因为此时已经不可能满足要求。

posted @ 2016-04-05 18:03  CarlGoodman  阅读(179)  评论(0编辑  收藏  举报