题目描述:
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]
]
题目分析:
这道题我自己理解是一个特殊子集问题,其中元素可重复但不能有重复子集。首先先将数集中的数按从小到大的顺序进行排列,利用DFS的算法思路进行选择。注意在递归中使用的初始值begin是原来的坐标,例如在本题中选取了2之后还要从2开始筛选。
代码:
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> combination;
sort(candidates.begin(), candidates.end());
combinationSum2(candidates, target, combination, result, 0);
return result;
}
private:
void combinationSum2(vector<int>& candidates, int target, vector<int>& combination, vector<vector<int>>& result, int begin) {
if (target == 0) {
result.push_back(combination);
return;
}
for (int i = begin; i < candidates.size(); i++) {
if (target >= candidates[i]) {
combination.push_back(candidates[i]);
combinationSum2(candidates, target-candidates[i], combination, result, i);
combination.pop_back();
}
}
}
};