加起來和為目标值的組合
//加起來和為目标值的組合
/*
給出一組候選數和一個目标數,找出候選數中起來和等于target的所有組合。
每個數字在一個組合中隻能使用一次。
組合中的數字要按遞增排序
結果中不能包含重複的組合
組合之間的排序按照索引從小到大依次比較,小的排在前面,如果索引相同的情況下數值相同,則比較下一個索引
*/
#include<vector>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
class Solution {
public:
//先排序然後dfs
vector<vector<int>> result;
vector<int> res;
void dfs(vector<int> num, int start, int& sum, int target)
{
if (sum == target)
{
result.push_back(res);
return;
}
else if (sum > target)
{
return;
}
for (int i = start; i < num.size(); ++i)
{
res.push_back(num[i]);
int temp = num[i];
sum += num[i];
dfs(num, i + 1, sum, target);
sum -= temp;
res.pop_back();
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
if (num.size() == 0)
return result;
sort(num.begin(), num.end());
int sum = 0;
dfs(num, 0, sum, target);
set<vector<int>> resSet;
for (auto r : result)
{
resSet.insert(r);
}
result.clear();
for (auto rSet : resSet)
{
result.push_back(rSet);
}
return result;
}
};