この問題が解決可能である場合。sum(ALL)/3
整数でなければなりません。どのソリューションにも が必要SUM(J) + SUM(K) = SUM(I) + sum(ALL)/3
です。これは 上の 2 分割問題の解を表していconcat(ALL, {sum(ALL)/3})
ます。
あなたは2パーティションの実装を持っていると言います:それを使ってその問題を解決してください。次に、(少なくとも) 2 つのパーティションの 1 つに番号が含まれます。そのパーティションsum(ALL)/3
から番号を削除すると、I
. もう一方のパーティションについては、2-partition を再度実行して、から分割J
しK
ます。結局のところ、合計自体が等しくなければなりませんJ
。K
編集:この解決策はおそらく間違っています - 連結セットの2分割にはいくつかの解決策があります(I、J、Kのそれぞれに少なくとも1つ) - しかし、他の解決策がある場合、「反対側」はそうではないかもしれませんI、J、K の 2 つの結合で構成され、まったく分割できない場合があります。あなたは実際に考える必要があるでしょう、私は恐れています:-)。
試行 2:次のマップを維持しながら、マルチセットを反復処理します。、、R(i,j,k) :: Boolean
を持つ 3 つのマルチセットに分割できるかどうかを表します。つまり、次の状態の任意の次の数andと を 保持します。複雑さ (excersize による) は、入力数値の大きさに依存することに注意してください。これは疑似多項式時間アルゴリズムです。Nikita のソリューションは概念的には似ていますが、3 番目のセットの合計を追跡しないため、このソリューションよりも効率的です。簡単に計算できるため、これは不要です。i
j
k
R(i,j,k)
n
R'
R'(i+n,j,k)
R'(i,j+n,k)
R'(i,j,k+n)