給定n(比如說3個人)和s(比如100 $),我們想要在n個人中進行劃分。Scala中的整數分區
因此,我們需要所有可能的n元組那筆S下方
我的Scala代碼:
def weights(n:Int,s:Int):List[List[Int]] = {
List.concat((0 to s).toList.map(List.fill(n)(_)).flatten, (0 to s).toList).
combinations(n).filter(_.sum==s).map(_.permutations.toList).toList.flatten
}
println(weights(3,100))
這當n的值較小。 (n = 1,2,3或4)。
超過n = 4,需要很長時間,實際上不可用。
我正在尋找方法來使用懶惰評估/流重寫我的代碼。
我的要求:必須爲N功高達10
警告:這個問題變得非常大非常快。從MATLAB我的結果 -
---For s =100, n = 1 thru 5 results are ---
n=1 :1 combinations
n=2 :101 combinations
n=3 :5151 combinations
n=4 :176851 combinations
n=5: 4598126 combinations
---
所以我猜「公平」不是一個問題?如果您添加關於如何分割s的限制,那麼組合的數量會少得多。 –
我不明白你爲什麼要真正產生一個所有組合的列表......?這樣做的目的是什麼? –
我不認爲有可能列出在普通計算機中總和爲100的所有10元組,因爲數量太大。但是,我們可以給出所有10元組的數量。 – Eastsun