获得将 N 项拆分为 K 箱的所有组合的算法

algorithm to get all combinations of splitting up N items into K bins

假设我有一个元素列表 [1,2,3,4,] 和多个箱子(假设有 2 个箱子),我想列出将项目 1-4 拆分为项目 2 的所有组合垃圾箱。解决方案应如下所示

[{{1}, {2,3,4}}, {{2}, {1,3,4}}, {{3}, {1,2,4}}, {{4}, {1,2,3}}, {{1,2}, {3,4}}, {{1,3}, {2,4}}, {{1,4}, {2,3}}, {{}, {1, 2, 3, 4}, {{1, 2, 3, 4}, {}}]

此外,顺序很重要——我没有写出所有 return 值,但 {{1, 2, 3}, {4}} 是与 {{3, 2, 1}, {4}}

不同的解决方案

常见的做法如下。

如果你有,比方说,K 个箱子,然后将 K-1 个特殊值添加到你的初始数组。我将使用 -1 值,假设它从未出现在初始数组中;您可以选择不同的值。

因此对于您的示例,初始数组变为 arr=[1,2,3,4,-1];例如,如果 K4,则数组将是 arr=[1,2,3,4,-1,-1,-1]

现在列出数组arr的所有排列。对于每个排列,将所有 -1 视为 bin 分隔符,因此第一个 -1 之前的所有元素都进入第一个 bin(以该特定顺序),第一个和第二个 [=13] 之间的所有元素=] 转到第二个垃圾箱,依此类推。

例如:

[-1,1,2,3,4] -> {{}, {1,2,3,4}}
[2,1,3,-1,4] -> {{2,3,4}, {4}}
[3,1,2,-1,4] -> {{3,1,2}, {4}}
[1,3,-1,2,4] -> {{1,3}, {2,4}}

等等。

生成所有排列是一项标准任务(例如,参见 Permutations in JavaScript?),将数组拆分 -1 应该很容易。