数组中可能会有重复值
在上个版本中做优化,去掉重复值,不重复利用
void backtrack(vector<int> &candidates, int target, list<vector<int> >&res, int i, vector<int> &tmp_list);
void comSum(vector<int>& candidates, int target)
{
list<vector<int> > res;
vector<int> tmp_list;
std::sort(candidates.begin(), candidates.end());
backtrack(candidates, target, res, 0, tmp_list);
for(list<vector<int> >::iterator it = res.begin(); it != res.end(); ++it)
{
vector<int>& l = *it;
for(vector<int>::iterator iit = l.begin(); iit != l.end(); ++iit)
{
printf("%d ", *iit);
}
printf("\n");
}
}
void backtrack(vector<int> &candidates, int target, list<vector<int> >&res, int i, vector<int> &tmp_list)
{
if(target < 0) return;
if(target == 0)
{
res.push_back(tmp_list);
return;
}
for(int start = i; start < candidates.size(); start++)
{
if(target < candidates[start])
break;
if(start > i && candidates[start] == candidates[start-1])
{
continue;
}
tmp_list.push_back(candidates[start]);
backtrack(candidates, target - candidates[start], res, start+1, tmp_list);
tmp_list.pop_back();
}
}
int main()
{
int arr[] = {2,5,2,1,2};
vector<int> varr(arr, arr+sizeof(arr)/sizeof(arr[0]));
comSum(varr, 5);
return 0;
}