【问题标题】:Algorithm to get all possible permutations of n numbers in a range that have specific sum获得具有特定总和的范围内n个数字的所有可能排列的算法
【发布时间】:2016-10-01 06:55:30
【问题描述】:

我正在尝试做的事情可以很容易地用一个例子来说明。假设如下:

var minNum = 1;
var maxNum = 30;
var sum = 75;
var amount = 6;

我想得到所有 amount 个数字的排列,这些数字加起来为 sum 并且 >= minNum &&

例如,如果我要手动创建这些排列,我会这样开始:

30,30,12,1,1,1

30,30,11,2,1,1

30,30,11,1,2,1

30,30,11,1,1,2

30,30,10,3,1,1

30,30,10,2,2,1

这是数学/编程中的一个已知问题吗?是否有任何算法可以解决它?

提前致谢。

【问题讨论】:

  • 您的示例中的可能性数量已经很大,超过数十万(我没有进行数学计算,但这是一个保守的估计)。时间和空间的复杂性至少可以说是具有挑战性的。你打算用这个做什么?注意:编程没有乐趣,至少对我来说不是。
  • 既然你只是在问一个算法,我认为这样的问题最好在programmers stack exchange site上问。
  • @phaze0:算法问题在这里并没有跑题。
  • @RobertHarvey 哦!很高兴知道。
  • 这是整数分区在限制范围内考虑术语顺序的M个加数的问题。一种可能的算法——递归生成

标签: javascript arrays algorithm


【解决方案1】:

这是一个 JavaScript 解决方案(如果您的环境递归深度限制了您想要的结果数量,您可以将递归转换为显式数组堆栈,像函数调用一样推送参数并弹出来处理它们):

function partition(n, min, max, parts) { 
  if (n < 0){
    return;
    
  } else if (n == 0) {
    document.getElementById('output').innerHTML += (JSON.stringify(parts)) + '<br>';
    
  } else {
    for (var i=max; i>=min; i--){
      var _parts = parts.slice();
      _parts.push(i);
      
      partition(n-i,min,max,_parts)
    }
  }
}

partition(6,2,4,[])
&lt;pre id="output"&gt;&lt;/pre&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2022-11-10
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多