🔗 leetcode.cn/problems/co…
题目
- 给一个无重复元素的数组,给一个目标整数 target
- 返回由数组中数字组合而成的 list,其总和为 target,返回所有可能性,数组中的元素可以重复使用
思路
- 递归枚举所有的可能性
- 递归退出的条件是,当前所选元素的 sum 总和为 target,或者超过 target,或者枚举完所有元素
- 枚举每个元素时,同样枚举其可以出现的次数,从 0 到 target/candidates[index] 次,回溯时,把这若干次移除
代码
class Solution {
public:
void dfs(vector<int>& candidates, int target, int index, int sum, vector<vector<int>>& ans, vector<int>& tmp) {
if (sum > target) return;
if (sum == target) {
ans.push_back(tmp);
return;
}
if (index >= candidates.size()) return;
dfs(candidates, target, index + 1, sum, ans, tmp);
int size = target / candidates[index];
for (int i = 1; i <= size; i++) {
tmp.push_back(candidates[index]);
dfs(candidates, target, index + 1, sum + candidates[index] * i, ans, tmp);
}
while (size--) {
tmp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> tmp;
dfs(candidates, target,0, 0, ans, tmp);
return ans;
}
};