給定無重複正整數數組 candidates 和目標 target,找出所有不重複組合使和為 target。每數字可無限重複使用。組合內非降序,解集無重複。
candidates 便於剪枝start 索引(保證非降序)、sum 當前和、path 當前組合sum == target → 記錄答案sum > target → 剪枝返回i = start..n-1:選 candidates[i],遞歸 dfs(i, sum+candidates[i])(注意傳 i 非 i+1,允許重複使用)class Solution {
void dfs(vector<int>& nums, int start, int target, vector<int>& path, vector<vector<int>>& res) {
if (target == 0) { res.push_back(path); return; }
if (target < 0) return;
for (int i = start; i < (int)nums.size(); ++i) {
path.push_back(nums[i]);
dfs(nums, i, target - nums[i], path, res); // i 允許重複
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>> res;
vector<int> path;
dfs(candidates, 0, target, path, res);
return res;
}
};
start 參數保證組合非降序,避免排列重複i 而非 i+1 實現無限重複使用target < 0 早期剪枝