【算法】组合求和

问题: 

已知数组:[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清空,执行下一个元素的循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值