获得将 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]
;例如,如果 K
是 4
,则数组将是 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
应该很容易。
假设我有一个元素列表 [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]
;例如,如果 K
是 4
,则数组将是 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
应该很容易。