在具有特定和的范围内获得n个数的所有可能排列的算法

时间:2016-06-01 18:49:25

标签: javascript arrays algorithm

我可以通过一个例子轻松说明我想要做的事情。假设如下:

public class MyPostAction extends ActionSupport {
    private List<MyData> resultsList = new ArrayList<>();
    //getter/setter
}

我希望获得加上总和的金额数字的所有排列,并且&gt; = minNum&amp;&amp; &lt; = maxNum。

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

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

这是数学/编程中的一个已知问题吗?有没有解决它的算法?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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,[])
<pre id="output"></pre>