class Solution {
public:
static bool cmp(const int & a,const int & b){return a<b;}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
map<int,vector<vector<int>>>mp;
mp[0] = vector<vector<int>>(1,vector<int>(0));
set<vector<int>>ss;
for(int i = 1;i<=target;i++)
{
for(int j = 0;j<candidates.size();j++)
{
if(i >= candidates[j])
{
int res = i-candidates[j];
for(int k = 0;k<mp[res].size();k++)
{
vector<int>tmp = mp[res][k];
tmp.push_back(candidates[j]);
sort(tmp.begin(),tmp.end(),cmp);
if(!ss.count(tmp))
mp[i].push_back(tmp);
ss.insert(tmp);
}
}
}
}
return mp[target];
}
};