枚举n个球到k个盒子的所有可能分布
Enumerate all possible distributions of n balls into k boxes
我所指的确切问题和问题的分布数量已计算 here。我有兴趣明确了解这些分布。
例如,有 5 个球和 3 个盒子:一种分布是盒子 1 中有 2 个球,盒子 2 中有 2 个球,盒子 3 中有 1 个称为 221。现在我想列出所有这些可能的分布: -
212
131
104
。
.
.
一种方法是我 运行 matlab 命令:perms([0,0,0,0,0,1,1,1])
。这基本上生成了 5 个球和 2 个棍子的所有排列。但由于命令 perms
无法识别相同的对象,因此存在大量多算。
您可以使用 unique()
删除由 perms()
:
生成的相同行
A = unique(perms([0,0,0,0,0,1,1,1]), 'rows');
% `A` will contain all combinations, not permutations, of [0,0,0,0,0,1,1,1]
很简单……有点像。
function alloc(balls, boxes):
if boxes = 1
return [balls]
else
for n in range 0:balls
return alloc(balls-n, boxes-1)
这是基本的递归逻辑:选择每个可能数量的球,然后对剩余的球进行递归并减少一个盒子。
列表粘合方法将依赖于语言;我把它们留给学生作为练习。
我所指的确切问题和问题的分布数量已计算 here。我有兴趣明确了解这些分布。
例如,有 5 个球和 3 个盒子:一种分布是盒子 1 中有 2 个球,盒子 2 中有 2 个球,盒子 3 中有 1 个称为 221。现在我想列出所有这些可能的分布: -
212
131
104
。 . .
一种方法是我 运行 matlab 命令:perms([0,0,0,0,0,1,1,1])
。这基本上生成了 5 个球和 2 个棍子的所有排列。但由于命令 perms
无法识别相同的对象,因此存在大量多算。
您可以使用 unique()
删除由 perms()
:
A = unique(perms([0,0,0,0,0,1,1,1]), 'rows');
% `A` will contain all combinations, not permutations, of [0,0,0,0,0,1,1,1]
很简单……有点像。
function alloc(balls, boxes):
if boxes = 1
return [balls]
else
for n in range 0:balls
return alloc(balls-n, boxes-1)
这是基本的递归逻辑:选择每个可能数量的球,然后对剩余的球进行递归并减少一个盒子。
列表粘合方法将依赖于语言;我把它们留给学生作为练习。