具体组合算法

时间:2013-03-06 06:28:43

标签: javascript algorithm combinations combinatorics

如果我有n个球和k个容器,那么这个 - > ((n + k-1)!/ n!(k-1)!)将计算出有多少种组合。

我无法更改此内容以生成javascript中所有组合的列表。

在一个带有一系列球和一些容器的功能中。

组合([1,2,3,4,5,6],3)

每个容器可以有任意数量的球,容器可以是空的。

这是我尝试的东西,但我只在每个容器中得到一个球。

function generateCombinations(array, r, callback) {
    function equal(a, b) {
        for (var i = 0; i < a.length; i++) {
            if (a[i] != b[i]) return false;
        }
        return true;
    }
    function values(i, a) {
        var ret = [];
        for (var j = 0; j < i.length; j++) ret.push(a[i[j]]);
        return ret;
    }
    var n = array.length;
    var indices = [];
    for (var i = 0; i < r; i++) indices.push(i);
    var final = [];
    for (var i = n - r; i < n; i++) final.push(i);
    while (!equal(indices, final)) {
        callback(values(indices, array));
        var i = r - 1;
        while (indices[i] == n - r + i) i -= 1;
        indices[i] += 1;
        for (var j = i + 1; j < r; j++) indices[j] = indices[i] + j - i;
    }
    callback(values(indices, array));
}
count = 0
generateCombinations([1,2,3,4,5,6,7,8,9,1],3,function(first){
             $("#hello").append(first+"<br />")
             count = count +1
})

$("#hello").append(count)

2 个答案:

答案 0 :(得分:1)

你可以这样做:

var containers = [];

// n - number of balls, k - number of containers
function dfs(n, k) {
    // Ending point of recursion, all balls are placed
    if(n == 0) {
        var output = [];
        for(var i = 0; i < k; i++) {
            output.push('{' + containers[i].join(', ') + '}');
        }
        output = '[' + output.join(', ') + ']';
        console.log(output);
        return;
    }

    // Try to put ball #n
    for(var i = 0; i < k; i++) {
        containers[i].push(n);

        // Now we have placed ball #n, so we have 1 .. n - 1 balls only
        dfs(n - 1, k);

        // Remove ball when back to use again
        containers[i].pop();
    }
}

var n = 4;
var k = 3;
for(var i = 0; i < k; i++) {
    containers[i] = [];
}
dfs(n, k);

答案 1 :(得分:0)

我最初认为你想要n个中k个元素的所有组合,但你的问题是不同的,它是在k个部分中分割n个元素。

在浏览元素时,在每个步骤中,您可以选择将当前元素放在任何容器中,即k种可能性。总的来说,你将有k n 可能的解决方案。

因此,迭代所有解决方案会更快,而不是将它们存储在数组中。

您可以将解决方案表示为基数k中的唯一数字,并带有n个数字,并通过递增该数字来迭代解决方案。

在你的例子中,基数是3,位数是6.第一个解决方案是将所有球放在容器0中,即。

  000000

下一个解决方案是将所有球放入容器0中,除了容器1中的最后一个。

  000001

...       000002       000010       000011       000020

希望你能明白这一点。