改进,从一个数组中找出 N 个数,其和为 M 的所有可能

该博客介绍了一种改进的算法,用于从数组中找出N个数,使其和等于M。通过二进制正序表示法,遍历所有可能的二进制数据,计算1的个数以确定选中元素的数量,并根据二进制数据求和。文章详细阐述了如何遍历二进制、计算1的个数以及根据二进制求和的步骤,提供了一个直观且简单的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特此说明,本文算法改自于《从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法》一文。本文不同的是,采用二进制正序表示法,这种实现思路更直观、更简单些。

问题

从一个数组中找出 N 个数,其和为 M 的所有可能。

举个例子,从数组 [1, 2, 3, 4] 中选取 2 个元素,求和为 5 的所有可能。答案是两组组合: 1,4 和 2,3。

假设封装函数为 search

function search(arr, count, sum) {
    ...
    return res
}
复制代码

则有,

search([1,2,3,4],2,5)
// => [[2,3],[1,4]]
复制代码

实现思路

这里我们简单说一下总体思路:根据数组长度构建二进制数据,再选择其中满足条件的数据。

我们用 1 和 0 来表示数组中某位元素是否被选中。因此,可以用 0110 来表示数组中第 1 位和第 2 位被选中了。

下面列一下长度为 4 的所有二进制数据表示情况:

  • 0000 表示没有选择数组中的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值