找到 bin 和 objects 的所有可能性

Find all possibilities of bin and objects

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

例如:

假设我们有容器:B1、B2 和对象 O1、O2,解决方案是:

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

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

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

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

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

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

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

这意味着,B1 有 2 个对象,B2 是空的,所以 1 因为 2^0 = 1

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

合并所有的bin,如果你使用add all(不知道它的复杂度是多少,但你可以看看Collections.addAll [具体来说java,会有其他更复杂的算法合并两个或多个数组]) 然后你可以用这里提到的算法在 O(n!) 中找到 N 个元素的所有组合。

Best way to find all combinations

假设 B 是箱数,O 是对象数。该算法应该只以 base-B 计数(而不是 base-10 或 base-2),从 0B 到 AA...AAB,其中 A = B - 1,位数等于 O.

以 B 为基数进行计数的最简单方法是使用长度为 O 的数组。在每个步骤中,将 ...XAA..AA 转换为 ...Y00..00,其中 X < AY = X + 1,部分 AA..AA 的长度甚至可以为零。尽可能重复。转换子数组的最简单方法是 运行 内部一个循环,从数组的一端开始 运行s,以模 B 递增项目,并在第一个不为零的项目之后停止递增,或者在数组的另一端。

每一步数组内容的解释就是每一个O位告诉我们On位于哪个bin对象