class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>>v,result;
vector<int>v2;
map<vector<int>,int>mp;
int n = candidates.size(),sum,t,n2,n3;
v.push_back(v2);
// for(int i=0;i<candidates.size();i++){
// cout<<candidates[i]<<" ";
// }
// cout<<endl;
mp[v2] = 0;
for(int i=0;i<n;i++){
n2 = v.size();
for(int k=0;k<n2;k++){
// bool flag = false;
for(int j=1;mp[v[k]]+j*candidates[i]<=target;j++){
v2 = v[k];
v2.push_back(candidates[i]);
v2.push_back(j);
if(mp[v[k]]+candidates[i]*j<=target){
v.push_back(v2);
mp[v2] = mp[v[k]]+candidates[i]*j;
// for(int l=0;l<v.size();l++){
// for(int m=0;m<v[l].size();m++){
// cout<<v[l][m]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
// flag = true;
}
}
// if(!flag)break;
}
}
n2 = v.size();
for(int i=0;i<n2;i++){
if(mp[v[i]]==target){
n3 = v[i].size();
v2.clear();
for(int j=0;j<n3;j+=2){
for(int k=0;k<v[i][j+1];k++){
v2.push_back(v[i][j]);
}
}
result.push_back(v2);
}
}
sort(result.begin(),result.end());
return result;
}
private:
bool isSame(vector<vector<int>>v,vector<int>v2){
int n = v.size(),m = v2.size();
for(int i=0;i<n;i++){
int p = v[i].size();
if(p==m){
bool flag = true;
for(int j=0;j<m;j++){
if(v[i][j]!=v2[j]){
flag = false;
break;
}
}
if(flag)
return true;
}
}
return false;
}
};