给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:dfs剪枝
从头开始遍历candidates数组,对于每一个元素,都有两种可能,1,答案中选这个数,2.答案中不选这个数。分别进行dfs,递归边界为临时数组temp中的元素之和等于target,将target压入答案ans中,返回。
剪枝:当数组中的元素之和已经大于target时,没有必要继续向下递归了,直接返回即可。
AC代码:(C++)
class Solution {
public:
vector<int> temp; //保存临时答案
void dfs(vector<vector<int>>& ans, vector<int>& candidates, int target,
int sum, int n, int index) {
if (sum == target) {
ans.push_back(temp); //保存结果
return;
}
if (index == n || sum > target)
return; //剪枝,当已经处理完n个数或者sum大于target时不再继续
//选index号数
temp.push_back(candidates[index]);
dfs(ans, candidates, target, sum + candidates[index], n, index);
//不选index号数
temp.pop_back();
dfs(ans, candidates, target, sum, n, index + 1);
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans; //保存答案
int n = candidates.size();
dfs(ans, candidates, target, 0, n, 0);
return ans;
}
};