我想n在m箱子中生成一组球的排列.以下嵌套列表集生成这些排列.
n <- 3
m <- 4
v <- rep(0,m)
for (i in n:0){
for (j in (n-sum(i)):0){
for (k in (n-sum(i,j)):0){
for (l in (n - sum(i,j,k)):0){
v <- c(i,j,k,l)
print(v)
if (sum(v) == n){ break }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印解决方案:
[1] 3 0 0 0
[1] 2 1 0 0
[1] 2 0 1 0
[1] 2 0 0 1
[1] 1 2 0 0
[1] 1 1 1 0
[1] 1 1 0 1
[1] 1 0 2 0
[1] 1 0 1 1
[1] 1 0 0 2
[1] 0 3 0 0
[1] 0 2 1 0
[1] 0 2 0 1
[1] 0 1 2 0
[1] 0 1 1 1
[1] 0 1 0 2
[1] 0 0 3 0
[1] 0 0 2 1
[1] 0 0 1 2
[1] 0 0 0 3
Run Code Online (Sandbox Code Playgroud)
排列的总数将是choose(n+m-1,m-1),并且排列的顺序对我来说无关紧要.但我很难将其变成一个可以使用任意数量的箱子的功能.(我不会破坏我的尝试,但它只是混乱的嵌套循环.)因此,如果比我更saavy的人可以将上面的嵌套循环转换为函数我会很感激.
或者如果已经存在可用于执行此类排列的函数(或者遵循不同的算法),我将很高兴被告知它.我更喜欢一种不会产生多余排列的方法(这里没有加起来n),然后丢弃它们,但对于像这样的小问题,这样做的解决方案是可以接受的.
Jos*_*ien 12
library(partitions)
compositions(3,4)
# [1,] 3 2 1 0 2 1 0 1 0 0 2 1 0 1 0 0 1 0 0 0
# [2,] 0 1 2 3 0 1 2 0 1 0 0 1 2 0 1 0 0 1 0 0
# [3,] 0 0 0 0 1 1 1 2 2 3 0 0 0 1 1 2 0 0 1 0
# [4,] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |