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:
map<int,int> numMap;
bool check(vector<int>& tmp){
map<int,int>::iterator iter;
int curr=tmp[0],num=1;
for(int i=1;i<tmp.size();i++){
if(tmp[i]==curr){
num++;
}else{
iter=numMap.find(curr);
if(num>iter->second){
return false;
}
curr=tmp[i];
num=1;
}
}
iter=numMap.find(curr);
if(num>iter->second){
return false;
}
return true;
}
void findPath(set<vector<int> >& numSet, vector<vector<int> >& dp,
vector<int> &num, vector<int>& path,int value){
if(value==0){
vector<int> tmp(path);
sort(tmp.begin(),tmp.end());
if(check(tmp)){
numSet.insert(tmp);
}
return;
}
for(int i=0;i<dp.size();i++){
if(dp[i][value]!=-1){
path.push_back(num[i]);
findPath(numSet,dp,num,path,dp[i][value]);
path.pop_back();
}
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<vector<int> > result;
if(num.empty()||num.size()==0){
return result;
}
int n=num.size();
sort(num.begin(),num.end());
numMap.clear();
map<int,int>::iterator iter;
for(int i=0;i<n;i++){
iter=numMap.find(num[i]);
if(iter==numMap.end()){
numMap.insert(make_pair(num[i],1));
}else{
iter->second++;
}
}
vector<vector<int> > dp(n,vector<int>(target+1,-1));
set<vector<int> > numSet;
vector<bool> visited(target+1,false);
vector<int> path;
visited[0]=true;
for(int i=0;i<n;i++){
if(num[i]>target){
break;
}
for(int j=target;j>=num[i];j--){
if(visited[j-num[i]]==true){
dp[i][j]=j-num[i];
visited[j]=true;
}
}
}
findPath(numSet,dp,num,path,target);
result.assign(numSet.begin(),numSet.end());
return result;
}
};