给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。
给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字 8,
解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]
分析:先排序,在对每个元素采取取或者不取的递归操作。
代码:
class Solution { public: /** * @param num: Given the candidate numbers * @param target: Given the target number * @return: All the combinations that sum to target */ vector<vector<int> > combinationSum2(vector<int> &num, int target) { // write your code here set<vector<int> > r; vector<int> cur; sort(num.begin(),num.end()); combination(cur,num,0,0,target,r); vector<vector<int> > ret; copy(r.begin(),r.end(),back_inserter(ret)); return ret; } void combination(vector<int> cur,vector<int> &num,int index,int curSum,int target,set<vector<int> >&ret) { if(curSum>target) return; if(curSum==target) { ret.insert(cur); return; } if(index==num.size()) return; combination(cur,num,index+1,curSum,target,ret); cur.push_back(num[index]); combination(cur,num,index+1,curSum+num[index],target,ret); } };