从数组中添加百分比等于值的项目

时间:2017-07-03 14:05:46

标签: javascript node.js

我有一个包含以下项目的数组:

[[ 'NAME 1',30 ]
[ 'NAME 2',120 ],
[ 'NAME 3', 90 ],
[ 'NAME 4',30 ]]

例如,我需要将此数组中的和作为60,因此在数组中它是第一个和最后一个元素。

我怎么能在node.js中做到这一点?

总结:我有一个数组,从数组我需要取x作为总和值(x是数字,如90,100)。如果数组中已存在目标编号,则表示该编号。如果它不存在,则应返回数字组合,组合中的数字应尽可能少。

1 个答案:

答案 0 :(得分:1)

感谢@ rbarilani关于Finding all possible combinations of numbers to reach a given sum中SubsetSum问题的代码,以下是调整后的程序:

  1. 从原始二维数组中提取数字。
  2. 如果存在完全匹配,则返回原始数组中的数字。
  3. 如果没有完全匹配,则在可能的组合中,提供最少的项目。
  4. 
    
    var originArr = [[ 'NAME 1',30 ], [ 'NAME 2',120 ], [ 'NAME 3', 90 ], [ 'NAME 4',30 ]];
    
    var arr = [];
    for (var i in originArr) {
      arr.push(originArr[i][1]);
    }
    
    var candidate;
    
    subsetSum(arr, 60);
    
    console.log(candidate ? candidate : 'No combination found');
    
    function subsetSum(numbers, target, partial) {
      var s, n, remaining;
    
      partial = partial || [];
    
      // sum partial
      s = partial.reduce(function (a, b) {
        return a + b;
      }, 0);
    
      // check if the partial sum is equals to target
      if (s === target) {
        if (!candidate || candidate.length > partial.length) {
          candidate = partial;
        }
      }
    
      if (s >= target) {
        return;  // if we reach the number why bother to continue
      }
    
      for (var i = 0; i < numbers.length; i++) {
        n = numbers[i];
        remaining = numbers.slice(i + 1);
        subsetSum(remaining, target, partial.concat([n]));
      }
    }
    &#13;
    &#13;
    &#13;