Leetcode-39.组合总和

题目描述

给定一个无重复元素的数组 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;
};