给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。
例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:
[7],
[2,2,3]
给出候选数组[2,3,6,7]和目标数字7
返回 [[7],[2,2,3]]
class Solution { public: map<vector<int>,bool> check ; void backtracing(vector<vector<int> > &ret,vector<int> &vec,vector<int> &can,int cur,int n,int left){ if(0==left){ if(0==check.count(vec)){ ret.push_back(vec); check[vec]=true; } return ; } for(int i=cur;i<n;++i){ if(can[i]<=left){ vec.push_back(can[i]); backtracing(ret,vec,can,i,n,left-can[i]); vec.pop_back(); }else break; } } vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<vector<int> > ret; vector<int> vec; int n; if((n=candidates.size())==0) return ret; sort(candidates.begin(),candidates.end()); backtracing(ret,vec,candidates,0,n,target); return ret; } };