どう書く?org : 自然数の分割

original page : http://ja.doukaku.org/89/

自然数nとm(n>=m>0)が与えられたとき,nをm個の非負の整数の和で表すやり方を全て出力してください.
その際,和の組(x_1, ..., x_m)は大きい順に出力してください.
ここでm = 3の時の「(a, b, c)が(A, B, C)より大きい」とは
(a > A)
(a == A) かつ (b > B)
(a == A) かつ (b == B) かつ (c > C)
のいずれかが成り立つとき(つまりは辞書的順序)とします.

例:n = 5, m = 3が与えられたときは
5, 0, 0,
4, 1, 0,
4, 0, 1,
3, 2, 0,
3, 1, 1,
...
0, 1, 4,
0, 0, 5,
を出力する.

#4342

original page : http://ja.doukaku.org/comment/4342/

なんのひねりもなく、組み合わせを列挙して和がnになるものを出力しています。

> invisible(partition.num(5, 3))
5, 0, 0
4, 1, 0
4, 0, 1
3, 2, 0
...
0, 1, 4
0, 0, 5

partition.num <- function(n, m){
   df <- expand.grid(replicate(m, n:0, simplify=FALSE))[,m:1]
   apply(df, 1, function(v)(if(sum(v)==n) cat(paste(v, collapse=", "), "\n")))
}