【DFS + 回溯】39. 组合总和 40. 组合总和 II 216. 组合总和 III
- 组合总和
class Solution {
public:
void dfs(vector<int>& candidates, vector<int> &cur, int index, int sum){
if(sum == target)
result.push_back(cur);
else{
for(int i=index;i<cand_len;++i){
if(sum + candidates[i] > target)
break;
else{
cur.push_back(candidates[i]);
dfs(candidates, cur, i, sum + candidates[i]);
cur.pop_back();
}
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
this->target = target;
sort(candidates.begin(), candidates.end());
cand_len = candidates.size();
vector<int> cur_num;
dfs(candidates, cur_num, 0, 0);
return result;
}
private:
int target;
int cand_len;
vector<vector<int>> result;
};
40. 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
class Solution {
public:
void dfs(vector<int>& candidates, vector<bool> &record, vector<int> &cur, int index, int sum){
if(sum == target)
result.push_back(cur);
else{
for(int i=index;i<cand_len;++i){
if(sum + candidates[i] > target)
break;
else if(i == index || candidates[i] != candidates[i-1]){ // 去重
cur.push_back(candidates[i]);
dfs(candidates, record, cur, i + 1, sum + candidates[i]);
cur.pop_back();
}
}
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
this->target = target;
sort(candidates.begin(), candidates.end());
cand_len = candidates.size();
vector<int> cur_num;
vector<bool> record(cand_len, false);
dfs(candidates, record, cur_num, 0, 0);
return result;
}
private:
int target;
int cand_len;
vector<vector<int>> result;
};
216. 组合总和 III
class Solution {
public:
void dfs(vector<int>& candidates, vector<int> &cur, int index, int sum){
if(cur.size() == target_len && sum == target)
result.push_back(cur);
else if(cur.size() >= target_len || sum >= target)
return;
else{
int num_len = cur.size();
for(int i=index;i<cand_len - (target_len - num_len) + 1;++i){
if(sum + candidates[i] > target)
break;
else{
cur.push_back(candidates[i]);
dfs(candidates, cur, i + 1, sum + candidates[i]);
cur.pop_back();
}
}
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> candidates{1,2,3,4,5,6,7,8,9};
target = n;
target_len = k;
cand_len = 9;
vector<int> cur_num;
dfs(candidates, cur_num, 0, 0);
return result;
}
private:
int target;
int cand_len;
int target_len;
vector<vector<int>> result;
};

浙公网安备 33010602011771号