此問題與另一個問題R:sample()密切相關。我想在R中找到一種方式來列出所有k個數的排列,其和爲k,其中每個數從0:k中選擇。如果k = 7,我可以從0,1,...,7中選擇7個數字。一個可行的解決方案是0,1,2,3,1,0,0另一個是1,1,1,1,1,1,1。我不想生成所有的排列,因爲如果k只是比7大,這個爆炸。列出k個數字的所有排列,取自0:k,表示總和爲k
當然在第k = 7實施例我可以使用以下:
perms7<-matrix(numeric(7*1716),ncol=7)
count=0
for(i in 0:7)
for(j in 0:(7-i))
for(k in 0:(7-i-j))
for(l in 0:(7-i-j-k))
for(n in 0:(7-i-j-k-l))
for(m in 0:(7-i-j-k-l-n)){
res<-7-i-j-k-l-n-m
count<-count+1
perms7[count,]<-c(i,j,k,l,n,m,res)
}
head(perms7,10)
但是我怎樣可以概括這種方法考慮到任意k,而無需編寫(K-1)環路? 我試圖想出一個遞推方案:
perms7<-matrix(numeric(7*1716),ncol=7) #store solutions (adjustable size later)
k<-7 #size of interest
d<-0 #depth
count=0 #count of permutations
rec<-function(j,d,a){
a<-a-j #max loop
d<-d+1 #depth (posistion)
for(i in 0:a) {
if(d<(k-1)) rec(i,d,a)
count<<-count+1
perms7[count,d]<<-i
perms7[count,k]<<-k-sum(perms7[count,-k])
}
}
rec(0,0,k)
但卡住了,我不太確定這是正確的道路要走。不知道是否有任何「魔術」R函數對於這個(雖然非常具體)的問題或者只是其中的一部分而言是整齊的。
在K = 7的情況下,所有的2.097.152置換和1.716該總和爲k = 7可以通過找到:
library(gtools)
k=7
perms <- permutations(k+1, k, 0:k, repeats.allowed=T) #all permutations
perms.k <- perms[rowSums(perms) == k,] #permutations which sums to k
對於k = 8有43.046.721排列,但我只想列出6.435。 任何幫助,非常感謝!
我相信這是有關漢諾塔的問題。包'fun'和'ref'有解決這個問題的功能。 – James 2014-09-25 09:17:54
我不明白這與河內塔問題有何關係,請您詳細說明一下?基本上我只需要計算Z^k中超平面的基數。 – 2014-09-25 09:46:41
這是k-tile,k-peg ToH所有可能狀態的空間。 ToH的最佳解決方案顯然不會試圖遍歷所有狀態,但如果您尋找最佳次優解決方案,您應該得到答案。 – James 2014-09-25 09:53:02