题目描述
给定一个无重复元素的数组 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]
]
解法1:回溯+剪枝
先对数组从小到大排序,然后进行回溯,
当当前和等于目标值 加入res,并返回,
若当前和+当前值>目标值 则进行下一轮回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); int sum=0,i=0; search(candidates,target,sum,i); return res; } void search(vector<int>& candidates, int target,int sum,int i) { int n=candidates.size(); int j; if(sum==target) { res.push_back(temp); return; } if(sum<target) { if(i<n&&sum+candidates[i]<=target) { for(j=0;sum+candidates[i]*j<=target;j++) { sum+=candidates[i]*j; int k=j; while(k-->0) temp.push_back(candidates[i]); search(candidates,target,sum,i+1); k=j; while(k-->0) temp.pop_back(); sum-=candidates[i]*j; } } } return ; } private: vector<vector<int>> res; vector<int> temp; };
|