题目描述:
给出一个没有重复元素的长度为 $ n $ 整数数组candidates
和一个目标整数target
,找出能够使数字和为目标数target
的所有不同组合,并返回。
其中candidates
中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。
数据范围:
$ 1\le n \le 30, 2\le candidates[i] \le 40 $
题解:
类似完全背包,也类似组合数。每个元素可以取或不取。取的话可以继续从当前位置开始继续取或不取。不取的话就从下一个位置开始。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const static int INF = 0x3f3f3f3f; vector<vector<int>> ans; void dfs(int step, int sum, int target, vector<int> &cur, vector<int> &nums) { if (sum == target) { ans.emplace_back(cur); return; } if (sum > target) return; if (step == nums.size()) return; cur.emplace_back(nums[step]); dfs(step, sum + nums[step], target, cur, nums); cur.pop_back(); dfs(step + 1, sum, target, cur, nums); } vector<vector<int>> combinationSum(vector<int> &candidates, int target) { vector<int> cur; dfs(0, 0, target, cur, candidates); return ans; } };
|