思路
本题和组合总和III非常相似,可以参考这篇博文:组合总和III,这里的区别就是,组合总和III中每个数只能使用一次,而本题中每个数可以重复使用,对于这一点,我们在下次递归的时候传入的就应该是i而不是i+1,因为i就是下一次也从当前数开始计算,这样可以对一个数字重复使用
另外组合总和III中对path有个数限制,而本题没有,所以最终只要sum和target相等就可以作为答案值,当sum的值已经大于target时,我们做剪枝
实现
var combinationSum = function (candidates, target) {
let result = [], path = [], sum = 0;
const backtracking = (candidates, target, startIndex) => {
if (sum === target) {
result.push([...path])
return
}
if (sum > target) return
for (let i = startIndex; i < candidates.length; i++) {
sum += candidates[i];
path.push(candidates[i])
backtracking(candidates, target, i)
sum -= path.pop()
}
}
backtracking(candidates, target, 0)
return result;
};