题目描述
看题明确以下几点
- 元素可以重复选取
- 要找到一个组合的和等于目标值
所以综上来说这和leetcode 77与lettcode 216本质上没有什么太大的差距,只不过还是细节的处理问题
具体实现在代码注释里
代码实现
我这里给出了两种剪枝的操作个人感觉都可以用
- 进行排序,再增加判断条件进行剪枝 代码注释就是剪枝操作
- 对总和进行判断
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
public:
void backtracking(vector<int>& candidates, int target, int sum, int start_index)
{
if(sum == target)
{
result.push_back(path);
return;
}
for(int i=start_index; i<candidates.size(); i++)
{
/*
if(target-sum < candidates[i])
{
cout << "t-s : " << target-sum << endl;
return;
} */
if(sum>target)
{
return;
}
path.push_back(candidates[i]);
sum += candidates[i];
// 因为可以重复选取那么i依旧是上次的i所以完成了重复选取
backtracking(candidates, target, sum, i);
sum -= candidates[i];
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int sum = 0;
// sort(candidates.begin(), candidates.end());
backtracking(candidates, target, sum, 0);
return result;
}
};