参考:
https://leetcode.com/problems/combination-sum/discuss/16530/Concise-Backtracking-Solution
class Solution {
public:
void search(vector<int>& num, int next, vector<int>& pSol, int target, vector<vector<int> >& result)
{
if(target == 0) //找到满足条件的路径
{
result.push_back(pSol); //放入结果中
return;
}
if(next == num.size() || target - num[next] < 0) //边界条件
return;
//对于每个元素,有两种处理方式,选当前元素或者不选当前元素
pSol.push_back(num[next]); //选当前元素
search(num, next, pSol, target - num[next], result);
pSol.pop_back(); //不选当前元素,将当前元素pop
search(num, next + 1, pSol, target, result); //从下一个元素开始找
}
vector<vector<int> > combinationSum(vector<int> &num, int target)
{
vector<vector<int> > result;
sort(num.begin(), num.end());
vector<int> pSol;
search(num, 0, pSol, target, result);
return result;
}
};
下面这个感觉写的不是很明白
class Solution {
public:
void compute(int start, int target, vector<int>& tmp, vector<int>& candidates, vector<vector<int>>& ans) {
int n = candidates.size();
for(int i = start; i < n; i ++){
if(target > 0){
tmp.push_back(candidates[i]);
compute(i, target-candidates[i], tmp, candidates, ans);
tmp.pop_back();
}
else if(target < 0)
return;
else{
ans.push_back(tmp);
return;
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> tmp;
int v;
sort(candidates.begin(), candidates.end());
compute(0, target, tmp, candidates, ans);
return ans;
}
};
采用深度搜索遍历,第一个for循环是该层的所有元素,对于每一个元素,先进行循环内的深度搜索,target<0算是一个剪枝条件。
转自
https://segmentfault.com/a/1190000007300946
参考
https://blog.youkuaiyun.com/jaster_wisdom/article/details/80683651
https://blog.youkuaiyun.com/qq_32805671/article/details/80783599
动态规划解法(未看)
https://leetcode.com/problems/combination-sum/discuss/16656/Dynamic-Programming-Solution
思路:
https://www.cnblogs.com/jimmycheng/p/7198156.html?utm_source=itdadao&utm_medium=referral