各パーティションの1つの要素との組み合わせの数をお探しですか?
それは単にn1*n2 * ...*nkです。
編集:あなたはまた別の質問をしているようです:
Nが与えられた場合、それらの積が最大になるようにn1、n2、...、nkを割り当てるにはどうすればよいですか。変数が乗算されるため、これは実際には線形最適化の問題ではありません。
これは、いくつかの微積分によって解決できます。つまり、ラグランジュ乗数を使用して、制約付きで各変数の部分的な派生変数を取得することによって解決できます。
その結果、n1..nkは可能な限り同じサイズに近くなるはずです。
if n is a multiple of k, then n_1 = n_2 = ... = n_k = n/k
otherwise, n_1 = n_2 = ... = n_j = Ceiling[n/k]
and n_j+1 = ... = n_k = floor[n/k]
基本的には、要素をパーティションにできるだけ均等に分散するようにしています。彼らが均等に分かれるなら、素晴らしい。そうでない場合は、可能な限り均等に分割し、残っているものはすべて、最初のパーティションにそれぞれ追加の要素を割り当てます。(最初のパーティションである必要はありません。その選択はかなり恣意的です。)このように、任意の2つのパーティションが所有する要素の数の差は最大で1つになります。
ゴーリーの詳細:
これは、私たちが最大化したい製品機能です。
P = n1 * n2 * ... nK
ラグランジュ乗数を使用して新しい関数を定義します。
ラムダ=P+ l(N-n1-n2 ... -nk)
そして、kn_i変数のそれぞれで偏導関数を取ります。
dLambda / dn_i = P / n_i --l
そしてlで:
dLambda / dl = N-n1 -n2 ... -nk
すべての偏導関数を=0に設定すると、k + 1方程式のシステムが得られ、それらを解くと、n1 = n2 = ...=nkが得られます。
いくつかの便利なリンク:
ラグランジュ乗数
最適化