找出集合中哪种数字组合加起来等于给定的总数?

时间:2019-12-24 10:41:51

标签: javascript bash math

我有一组数字;例如:[12, 13, 15, 18]。我必须从中查找其总和是特定的“总值”的元素,例如:25为12 + 13。

编辑:首先感谢大家的宝贵反馈,但我想你们中的许多人都误解了我的问题!我的问题不仅是“两个结合”,而且是两个以上。例如:

1 2 3 4 5 6 7 8 9 10 100

从上面的列表中,我们需要获得“ 119”,这里我们需要的不仅仅是“两个组合”。

如何通过bash脚本或JavaScript编写代码?

请帮助。

6 个答案:

答案 0 :(得分:4)

您可以采取递归方法,并使用短路检查总和是否大于给定总和的每种组合。

function getSum(numbers, sum) {
    function iter(index, right, left) {
        if (!left) return result.push(right);
        if (left < 0 || index >= numbers.length) return;
        iter(index + 1, [...right, numbers[index]], left - numbers[index]);
        iter(index + 1, right, left);
    }

    var result = [];
    iter(0, [], sum);
    return result;
}

getSum([12, 13, 15, 18], 25).forEach(a => console.log(...a));
console.log('--')
getSum([1, 2, 3, 4, 5], 10).forEach(a => console.log(...a));

答案 1 :(得分:0)

您可以使用indexOf方法做一些简单的事情。

function findComb(arr, sum) {
  for (let i = 0; i < arr.length - 1; i++) {
    let j = arr.indexOf(sum - arr[i], i);
    if (j !== -1) {
      return [arr[i], arr[j]]
    }
  }
}

console.log(findComb([12, 13, 15, 18], 25))

注意: :将仅返回第一个组合,并且限制为2个数字。

答案 2 :(得分:0)

let orgArr=[12,13,14,11,15,18];

orgArr.filter((each,i,orgArr)=>orgArr[i+1]!==undefined?each+orgArr[i+1]===25?console.log(each,"..",orgArr[i+1]):"":"")

它将为您提供总和为25的货币对

答案 3 :(得分:0)

bash版本:

#!/usr/bin/env bash

function find_sum {
    local sum=$1 first=$2; shift 2
    while test $# -gt 0; do
        for c; do
            if  test $sum = $(($first + $c)); then
                echo $sum = $first + $c
            fi
        done
        first=$1; shift
    done
}

find_sum 25 15 12 13 18

答案 4 :(得分:0)

这是背包问题的一种变体,请尝试通过Google搜索。您可以在2 ^ n中或在n ^ 2中使用二维数组来存储部分结果的方法来递归地找到解决方案。

答案 5 :(得分:0)

使用indexOfSet查找所有组合以存储唯一值:

function findComb(total, arr) {
  const output = new Set([]);
  arr.forEach((el, index) => {
    const i = arr.indexOf(total - el, index);
    if(i > -1) { output.add(el); output.add(arr[i]); }
  });
  return [...output];
}
console.log(findComb(25, [12, 13, 15, 18]));
console.log(findComb(25, [12, 13, 7, 15, 18, 12]));