题目: Given a set of candidate numbers (C) (without duplicates) 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.
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]
]
解题过程: 这道题最好用递归的方法,先将候选数组元素排好序,遍历每个元素做递归,遍历到当前元素有两种选择,第一种,选取这个数,然后继续在这个位置进行递归。第二种,不选取这个数,在这个数后面的位置进行递归。
代码:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > result;
vector<int> combination;
if(!candidates.empty()) {
sort(candidates.begin(), candidates.end());
combinationSumAssist(candidates, 0, target, result, combination);
}
return result;
}
void combinationSumAssist(vector<int> &candidates, int index, int target, vector<vector<int> > &result, vector<int> &combination) {
if(index >= candidates.size()) {
return;
}
int temp = target - candidates[index];
if(temp >= 0) {
combination.push_back(candidates[index]);
if(temp == 0) {
result.push_back(combination);
} else {
combinationSumAssist(candidates, index, temp, result, combination);
}
combination.pop_back();
}
combinationSumAssist(candidates, index + 1, target, result, combination);
}