//给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
//
// candidates 中的数字可以无限制重复被选取。
//
// 说明:
//
//
// 所有数字(包括 target)都是正整数。
// 解集不能包含重复的组合。
//
//
// 示例 1:
//
// 输入:candidates = [2,3,6,7], target = 7,
//所求解集为:
//[
// [7],
// [2,2,3]
//]
//
//
// 示例 2:
//
// 输入:candidates = [2,3,5], target = 8,
//所求解集为:
//[
// [2,2,2,2],
// [2,3,3],
// [3,5]
//]
//
//
//
// 提示:
//
//
// 1 <= candidates.length <= 30
// 1 <= candidates[i] <= 200
// candidate 中的每个元素都是独一无二的。
// 1 <= target <= 500
//
// Related Topics 数组 回溯算法
// 👍 1200 👎 0
/*
* 39 组合总和
* 2021-03-06 19:59:10
* @author oxygenbytes
*/
#include "leetcode.h"
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
set<int> s;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
if(candidates.empty()) return {};
dfs(candidates, target, 0);
return ans;
}
void dfs(vector<int>& candidates, int target, int start){
if(target < 0) return ;
if(target == 0){
ans.push_back(path);
return ;
}
for(int i = start;i < candidates.size();i++){
path.push_back(candidates[i]);
dfs(candidates, target - candidates[i], i);
path.pop_back();
}
}
};
//leetcode submit region end(Prohibit modification and deletion)