You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript查找数组中所有和为28的不重复元素组合

子集和问题实现方案(元素单次使用)

你需要实现的是典型的无重复元素子集和求解,使用回溯算法即可完成,核心逻辑是遍历元素时仅向后递归,避免重复调用同位置元素,同时加入剪枝逻辑减少不必要的计算。

完整可运行代码

const array = [2,4,6,8,20,12,14,16,18,40]
const target = 28
const result = []

// 回溯参数:遍历起始索引、剩余需要凑的数值、当前已选组合
function backtrack(startIndex, remainValue, currentGroup) {
    // 剩余数值为0,说明当前组合符合要求,存入结果
    if (remainValue === 0) {
        result.push([...currentGroup])
        return
    }
    // 剩余数值小于0或已经遍历完所有元素,直接终止当前分支
    if (remainValue < 0 || startIndex >= array.length) return

    for (let i = startIndex; i < array.length; i++) {
        // 剪枝:当前元素已经大于剩余需要凑的数值,直接跳过
        if (array[i] > remainValue) continue
        // 选中当前元素
        currentGroup.push(array[i])
        // 递归处理下一个元素,i+1保证不会重复使用当前位置的元素
        backtrack(i + 1, remainValue - array[i], currentGroup)
        // 回溯:撤销对当前元素的选择
        currentGroup.pop()
    }
}

backtrack(0, target, [])
// 打印所有符合要求的组合
console.log(result)

输出结果

运行上述代码,得到的所有符合条件的组合如下:

[
  [2,4,6,16],
  [2,4,8,14],
  [2,6,8,12],
  [2,6,20],
  [2,8,18],
  [2,12,14],
  [4,6,18],
  [4,8,16],
  [6,8,14],
  [8,20],
  [12,16]
]

如果提前对数组做升序排序,还可以进一步优化剪枝逻辑,当前元素大于剩余值时直接终止当前循环,减少遍历次数。

内容的提问来源于stack exchange,提问作者Xchum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 22:15:04