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

时间:2015-06-16 17:48:24

标签: algorithm recursion permutation

假设我有一个元素列表[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}, {}}]

此外,订单确实很重要 - 我没有写出所有的返回值,但{{1, 2, 3}, {4}}是与{{3, 2, 1}, {4}}不同的解决方案

1 个答案:

答案 0 :(得分:3)

一种常见的方法如下。

如果您有K个分区,请在初始数组中添加K-1个特殊值。我将使用-1值,假设它永远不会出现在初始数组中;你可以选择不同的价值。

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

现在列出数组arr的所有排列。对于每个排列,将所有-1视为bin分隔符,因此所有元素都是第一个-1转到第一个bin(按特定顺序),第一个和第二个{{1之间的所有元素转到第二个bin,依此类推。

例如:

-1

等等。

生成所有排列是一项标准任务(例如,参见Permutations in JavaScript?),并且按[-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}} 分割数组应该很容易。