找到bin和对象的所有可能性

时间:2015-03-06 22:51:57

标签: algorithm recursion combinations

给定一组有限的箱子和物体,其中箱子的大小(他们可以容纳的物体数量没有限制。什么是计算箱子中物体的所有可能性的有效算法。

例如:

让我们说我们有垃圾箱:B1,B2和对象O1,O2解决方案是:

B1 => [O1, O2] 
B2 => []

B1 => []
B2 => [O1, O2]

B1 => [O2]
B2 => [O1]

B1 => [O1]
B2 => [O2]

2 个答案:

答案 0 :(得分:1)

假设B是箱数,O是物体数。该算法应该只计入base-B(而不是base-10或base-2),从0 B 计数到AA ... AA B ,其中{ {1}},并且位数等于O。

在base-B中计算的最简单方法是使用长度为O的数组。在每个步骤中将... XAA..AA转换为... Y00..00,其中A = B - 1和{{ 1}}和部分AA..AA的长度甚至可以为零。尽可能重复。转换子数组的最简单方法是运行内部循环,该循环从数组的一端运行,以模数B递增项,并在增量后第一项不为零之后停止,或者在另一端运行。阵列。

每一步中对数组内容的解释是每个O数字告诉我们哪个bin对象O n

答案 1 :(得分:0)

根据我的理解,一个简单的解决方案可以是:

我们假设,我们有两个箱子(根据您提到的解决方案):

B1 => [O1, O2] 
B2 => []

这意味着,B1有2个对象,B2为空,因此1 ^因为2 ^ 0 = 1

总计= 3 和可能性总数= 2 ^ 3 = 8

结合所有垃圾箱,如果你使用全部添加(不确定它的复杂程度,但你可以看一下Collections.addAll [特别是java,会有其他算法具有更好的复杂性来合并两个或多个数组])然后你可以用这里提到的算法找到O(n!)中N个元素的所有组合。

Best way to find all combinations