问题:
已知数组:[2, 3, 5, 8, 6],求和为8的组合,元素不可重复使用,有哪些组合?元素可以重复使用,有哪些组合?
const getArr = (arr, target) => {
const res = [];
const func = (start, temp, sum) => {
if (sum >= target) {
if (sum == target) {
res.push(temp.slice()); // 拷贝当前temp的组合
}
return; // 跳出本次循环
}
for (let i = start; i < arr.length; i++) {
temp.push(arr[i]);
func(i, temp, sum + arr[i]); // 递归调用func,元素可重复传i;不重复i+1
temp.pop(); 清空temp
}
};
func(0, [], 0);
return res;
};
console.log(getArr([2, 3, 5, 8, 6], 8));
思路:
- 定义一个空数组,存储符合总和为8的组合
- 从数组索引0开始,每一个元素加入到temp数组中
- 递归调用func,将后面元素依次加入temp,temp中的元素相加,得到sum
- 当sum大于等于target时,将sum=target的组合加入res,当sum大于target的,不需要加入res
- 跳出本次元素循环后,将temp清空,执行下一个元素的循环