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.
- Elements in a combination (a1, a2, � , ak) must be in non-descending order. (ie, a1 ? a2 ? � ? ak).
- 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:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
set<vector<int> > ret;
vector<vector<int> > myret;
vector<int> path(candidates.size(),0);
sort(candidates.begin(),candidates.end());
combination(0,target,candidates,path,myret);
for(int i=0 ; i<myret.size() ; i++){
vector<int> temp;
for(int j=0 ; j<myret[i].size() ; j++){
for(int k=0 ; k<myret[i][j] ; k++){
temp.push_back(candidates[j]);
}
}
ret.insert(temp);
}
return vector<vector<int> >(ret.begin(),ret.end());
}
void combination(int depth, int target, vector<int>& candidates, vector<int>& path, vector<vector<int> >& ret){
if(depth==candidates.size()){
if(target==0)
ret.push_back(vector<int>(path));
return;
}
for(int i=0 ; i<target/candidates[depth]+1 ; i++){
path[depth]=i;
combination(depth+1,target-i*candidates[depth],candidates,path,ret);
}
}
};
那应该怎么办?直觉上这道题应该用动态规划去解,但是怎么解,如果你有答案的话,跪求!!!!!!!