题目描述
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:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
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]
]解题思路
这个题目就是背包问题简化版吧,二叉树,两种情况,放还是不放。
一开始就是这样些的,后来发现一个小问题就是结果可能没有去重,如果背包有两个相同元素。
后来我就很暴力的用set。。。。
最后在转成vector返回。。。- 代码实现
#include<set>
using namespace std;
class Solution {
public:
set<vector<int> > res;
int path[10000];
void getRes(vector<int>& nums,int target,int index,int sum,int pathlen){
if(sum==target){
vector<int> t;
for(int i=0;i<pathlen;++i)
t.push_back(path[i]);
res.insert(t);
}
else if(sum>target)
return ;
else {
if(index!=nums.size()){
//放进去
path[pathlen]=nums[index];
getRes(nums,target,index+1,sum+nums[index],pathlen+1);
//不放进去
//if(nums[index]!=nums[index+1])
getRes(nums,target,index+1,sum,pathlen);
}
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
getRes(candidates,target,0,0,0);
vector<vector<int> > vres;
set<vector<int>>::iterator it=res.begin();
for(;it!=res.end();++it)
vres.push_back(*it);
return vres;
}
};