给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
就是组合成这个数字,令人欣慰的是,我们可以使用反向思维,将数字拆解,每次拆解只能与之前相同或者更大,真的完美了。
int sum(vector<int> &v){
int res=0;
for(int i=0; i<v.size(); i++)
res += v[i];
return res;
}
class Solution {
vector<vector<int>> res;
map<int, bool> m;
void dfs(vector<int> v, int a, int target){
if(sum(v) >= target){
if(sum(v) == target) res.push_back(v);
return;
}
for(int i=a; i<=target; i++){
if(m[i]){
v.push_back(i);
dfs(v, i, target);
v.pop_back();
}
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
for(int var : candidates) m[var] = true;
vector<int> v;
dfs(v, 1, target);
return res;
}
};