天天看點

加起來和為目标值的組合

加起來和為目标值的組合

//加起來和為目标值的組合
/*
給出一組候選數和一個目标數,找出候選數中起來和等于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;
	}
};