标签:
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
For example, given candidate set 10,1,2,7,6,1,5
and target 8
,
A solution set is: [1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
题目实际和组合之和(见其他博文)很像,但是这里组合中的数是可以有重复的,但是每个数最多只能用一次,所以说实现上与前面那个有点不相似的地方,代码见下,注释写的还是比较清楚的:
1 class Solution { 2 public: 3 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { 4 tmpCdd = candidates; 5 sort(tmpCdd.begin(), tmpCdd.end()); 6 vector<int> tmpVec; 7 dfs(tmpVec, 0, target);//这个dfs的参数分别是当前vec中含有的元素数目 8 return result; //序号起始以及,距离target还差的数目 9 } 10 private: 11 vector<int> tmpCdd; 12 vector<vector<int>> result; 13 void dfs(vector<int> & tmpVec, int index, int tgt) 14 { 15 if(tgt == 0){ 16 result.push_back(tmpVec); 17 return; //达到target,剪枝 18 } 19 if(index == tmpCdd.size()) return; 20 else{ 21 for(int idx = index; idx < tmpCdd.size(); ++idx){ 22 if (idx != index && tmpCdd[idx] == tmpCdd[idx - 1]) 23 continue; //这一步的主要目标是防止相邻相同的数和其他数一起匹配成为多个相同的vector,很关键。 24 if(tmpCdd[idx] <= tgt){ 25 tmpVec.push_back(tmpCdd[idx]); //这其他的实际上和combinationSum1是相同的 26 dfs(tmpVec, idx + 1, tgt - tmpCdd[idx]); 27 tmpVec.pop_back(); 28 } 29 } 30 } 31 } 32 };
大体就是这样,感觉写的有点乱,想想以后可能再来改。
LeetCode OJ:Combination Sum II (组合之和 II)
标签:
原文地址:http://www.cnblogs.com/-wang-cheng/p/4866762.html