給定無重複的正整數候選集 C 和目標 T,找出所有組合使和為 T。候選數可無限次使用。組合內非降序,解集無重複。
排序候選數組。遞歸函數參數包含當前起始索引 start、當前和 sum。從 start 開始嘗試選擇候選數,選擇後遞歸調用仍傳 i(而非 i+1),允許重複使用。剪枝:sum > target 返回;candidates[i] > target - sum break。
class Solution {
vector<vector<int>> res;
void comb(vector<int>& cand, int idx, int sum, int target, vector<int>& path) {
if (sum > target) return;
if (sum == target) { res.push_back(path); return; }
for (int i = idx; i < cand.size(); ++i) {
if (cand[i] > target - sum) break;
path.push_back(cand[i]);
comb(cand, i, sum + cand[i], target, path); // i 允許重複用
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<int> path;
comb(candidates, 0, 0, target, path);
return res;
}
};
| 特性 | Combination Sum | Combination Sum II |
|---|---|---|
| 候選數重複 | 無 | 可有 |
| 使用次數 | 無限 | 一次 |
| 去重邏輯 | 無需 | 同層跳過重複值 |
| 遞歸起始索引 | i | i+1 |