回溯法
void backtracking(vector<vector <int>> &res,vector<int> &tem,vector<int> &cand,int cur,int n,int left)
{
map<vector<int>,int> m;
if(left==0)
{
if(m.count(tem)==0)
{
res.push_back(tem);
m[tem]=1;
}
return ;
}
else
{
for(int i=cur;i<n;i++)
{
if(cand[i]<=left)
{
tem.push_back(cand[i]);
backtracking(res,tem,cand,i,n,left-cand[i]);
tem.pop_back();
}
}
}
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target)
{
// write your code here
vector<vector <int>> res;
vector<int> tem;
if(candidates.empty())
return res;
int n=candidates.size();
sort(candidates.begin(),candidates.end());
backtracking(res,tem,candidates,0,n,target);
return res;
}