题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
示例1
示例2
题解
本题看似简单,实则略微复杂,每个数可以重复取,而不是只取一次或者不取,一个数可以取多次,先到了使用递归的回溯方法,然而回溯法是令人比较头疼的算法。
对于candidates中的数使其总和为target,使用递归函数,先用index索引标记第一个数,从第一个数开始判断,选择或者不选择;跳过则index+1,其他值不变;选择该数,将该数加入vector数组尾部,target=target-candidates[index],并且index不变传入递归函数(因为每个数可以选择多次),选择的递归函数结束后将vector尾部元素弹出(这一步是回溯,不管这一步成功或者不成功,都需要回溯,去其他分支寻找其他可能的解)
官方图解
代码
class Solution {
public:
void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {
if (idx == candidates.size()) {
return;
}
if (target == 0) {
ans.emplace_back(combine);
return;
}
// 直接跳过
dfs(candidates, target, ans, combine, idx + 1);
// 选择当前数
if (target - candidates[idx] >= 0) {
combine.emplace_back(candidates[idx]);
dfs(candidates, target - candidates[idx], ans, combine, idx);
combine.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> combine;
dfs(candidates, target, ans, combine, 0);
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/combination-sum/solution/zu-he-zong-he-by-leetcode-solution/
来源:力扣(LeetCode)