特此说明,本文算法改自于《从一个数组中找出 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 表示没有选择数组中的