给定一个无重复元素的数组 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]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:这个题就是去重比较麻烦,在dfs的时候需保留上一个所用的值,要保证下一次获取的值大于等于上次保留的值
class Solution {
public:
vector<vector<int>>vect;
// target目标值 sum当前总和 a原数据集合 v保留成功结果 x保留上一次选的值
void dfs(int target,int sum,vector<int>& a,vector<int> v,int x){
if(sum > target) return ;
if(sum == target){
vect.push_back(v);
return ;
}
for(int i=0;i<a.size();i++){
if(a[i] < x) continue;
sum+=a[i]; v.push_back(a[i]);
dfs(target,sum,a,v,a[i]);
sum-=a[i]; v.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& a, int target) {
sort(a.begin(),a.end());
for(int i=0;i<a.size();i++){
vector<int>v; v.push_back(a[i]);
dfs(target,a[i],a,v,a[i]);
}
return vect;
}
};