Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]
标准的回溯题。
一开始还纳闷怎么让一个元素可以取多次,而同时保持不重复。
其实递归的时候start=i就行了
如果start=i+1就是让彼此互不重复
class Solution {
public:
int target;
int n;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
this->target=target;
this->n=candidates.size();
vector<vector<int> > result;
vector<int> temp;
dfs(temp,0,0,candidates,result);
return result;
}
void dfs(vector<int>& temp,int sum,int start,vector<int>& candidates,vector<vector<int> >& result){
if(sum==target){
result.push_back(temp);
return;
}
for(int i=start;i<n;i++){
//由于可以重复取,故不需要判重
if(sum+candidates[i]<=target){
temp.push_back(candidates[i]);
dfs(temp,sum+candidates[i],i,candidates,result);
temp.pop_back();
}
}
}
};
II要求互不重复
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
class Solution {
public:
int target;
int n;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
this->target=target;
this->n=candidates.size();
sort(candidates.begin(),candidates.end());
vector<vector<int> > result;
vector<int> temp;
dfs(temp,0,0,candidates,result);
return result;
}
void dfs(vector<int>& temp,int sum,int start,vector<int>& candidates,vector<vector<int> >& result){
if(sum==target){
//判重
int flag=0;
for(int i=0;i<result.size();i++){
if(result[i].size()!=temp.size()) continue;
int j=0;
for(;j<temp.size() && result[i][j]==temp[j];j++);
if(j==temp.size()){
flag=1;break;
}
}
if(!flag)
result.push_back(temp);
return;
}
for(int i=start;i<n;i++){
//由于可以重复取,故不需要判重
if(sum+candidates[i]<=target){
temp.push_back(candidates[i]);
dfs(temp,sum+candidates[i],i+1,candidates,result);
temp.pop_back();
}
}
}
};