原题题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415081430853.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NTAwNTE2,size_16,color_FFFFFF,t_70)
代码实现(首刷自解)
class Solution {
public:
vector<int> temp;
vector<vector<int>> ret;
void backtracking(const vector<int>& candidates,vector<int>& temp,int startpos,int sum,int target)
{
if(sum == target)
{
ret.push_back(temp);
return;
}
for(int i=startpos;i<candidates.size();++i)
{
int num = candidates[i];
if(sum+num<=target)
{
temp.push_back(num);
backtracking(candidates,temp,max(startpos,i),sum+num,target);
temp.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtracking(candidates,temp,0,0,target);
return ret;
}
};
代码实现(二刷自解 DAY 239 C++)
class Solution {
public:
void backtracking(vector<vector<int>>& ret,vector<int>& arr,vector<int>& tmp,int target,int tmpsum,int pos)
{
if(tmpsum == target)
{
ret.emplace_back(tmp);
return;
}
if(tmpsum > target || pos == arr.size())
return;
int size = arr.size();
auto sum = tmpsum;
for(int i = pos;i < size;++i)
{
auto tmpsum = sum;
int times = 0;
for(;tmpsum <= target;++times)
{
tmpsum += arr[i];
tmp.emplace_back(arr[i]);
backtracking(ret,arr,tmp,target,tmpsum,i + 1);
}
while(times--) tmp.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> tmp;
backtracking(ret,candidates,tmp,target,0,0);
return ret;
}
};
代码实现(三刷自解 DAY 288 C++)
class Solution {
public:
void BackTracking(vector<vector<int>>& ret, vector<int>& candidates, vector<int>& tmp, int target, int index, int sum) {
if (sum >= target) {
if (sum == target) {
ret.emplace_back(tmp);
}
return;
}
for (int i = index; i < candidates.size(); ++i) {
tmp.emplace_back(candidates[i]);
BackTracking(ret, candidates, tmp, target, i, sum + candidates[i]);
tmp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> tmp;
BackTracking(ret, candidates, tmp, target, 0, 0);
return ret;
}
};
代码实现(四刷自解 DAY 8 Golang)
var ret [][]int
var tmp []int
func Backtracking(candidates []int, target, tmpsum, pos int) {
if tmpsum > target {
return
}
if target == tmpsum {
copytmp := make([]int, len(tmp))
copy(copytmp, tmp)
ret = append(ret, copytmp)
return
}
for i := pos; i < len(candidates); i++ {
tmpsum += candidates[i]
tmp = append(tmp, candidates[i])
Backtracking(candidates, target, tmpsum, i)
tmp = tmp[:len(tmp) - 1]
tmpsum -= candidates[i]
}
}
func combinationSum(candidates []int, target int) [][]int {
ret = [][]int{}
tmp = []int{}
Backtracking(candidates, target, 0, 0)
return ret
}