class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型vector * @param target int整型 * @return int整型vector<vector<>> */ void dfs(const vector<int>& a, int start, int remain, vector<int>& path, vector<vector<int>>& res) { if (remain == 0) { // 命中目标 res.push_back(path); return; } for (int i = start; i < a.size(); ++i) { if (a[i] > remain) break; // 剪枝:后面更大,直接结束 if (i > start && a[i] == a[i - 1]) continue; // 同层去重 path.push_back(a[i]); dfs(a, i + 1, remain - a[i], path, res); // 每个数只用一次 path.pop_back(); // 回溯 } } vector<vector<int> > combinationSum2(vector<int>& num, int target) { // write code here vector<vector<int>> res; vector<int> path; sort(num.begin(), num.end()); // 先排序方便去重与剪枝 dfs(num, 0, target, path, res); return res; } };