题目描述

看题明确以下几点
- 元素可以重复选取
- 要找到一个组合的和等于目标值
所以综上来说这和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;
}
};
本文详细解析了一种解决组合求和问题的算法实现,通过回溯法寻找所有可能的组合,使得这些组合的元素之和等于给定的目标值。特别讨论了元素可以被重复选择的情况,并提供了两种剪枝策略来优化搜索过程。
737

被折叠的 条评论
为什么被折叠?



