如果我有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)
答案 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
希望你能明白这一点。