SOURCE

/**
 * @param arr 目标数组
 * @param count 要选取的元素数目
 * @param sum 目标和
 * @returns [] 计算结果的数组
 */
const search = (arr, count, sum) => {
    // 利用二进制,选择元素的个数
    const n = num => {
        let count = 0;
        while (num) {
            num &= num - 1;
            count++;
        }
        return count;
    };

    let len = arr.length;
    let bit = 1 << len; // 换算成二进制,所有情况的总和
    let res = [];

    // 遍历所有的选择情况, 这里忽略了 0 的情况(n = 0)
    for (let i = 1; i < bit; i++) {
        // 满足选择的元素个数 === count
        if (n(i) === count) {
            let s = 0;
            let temp = [];

            // 每一种满足个数为 n 的选择情况下,继续判断是否满足 和为 m
            for (let j = 0; j < len; j++) {
                // 建立映射,找出选择位上的元素
                if ((i & (1 << j)) !== 0) {
                    s += arr[j];
                    temp.push(arr[j]);
                }
            }

            // 如果这种选择情况满足和为 M , 添加到结果数组中
            if (s === sum) {
                res.push(temp);
            }
        }
    }
    return res;
};

const s = search([1,2,3,4,5,6,7,8,9,10], 10 ,10)
console.log(s)
console 命令行工具 X clear

                    
>
console