まず、いくつかの定義:
- とが与えられた場合
n
、マルチセットk
のソートされたリストを検討してください。各マルチセットについて、繰り返しを使用して番号を選択します。k
{0, 1, ..., n-1}
たとえば、n=5
およびの場合、次のようになりk=3
ます。
[(0、0、0)、(0、0、1)、(0、0、2)、(0、0、3)、(0、0、4)、(0、1、1)、( 0、1、2)、(0、1、3)、(0、1、4)、(0、2、2)、(0、2、3)、(0、2、4)、(0、 3、3)、(0、3、4)、(0、4、4)、(1、1、1)、(1、1、2)、(1、1、3)、(1、1、 4)、(1、2、2)、(1、2、3)、(1、2、4)、(1、3、3)、(1、3、4)、(1、4、4) 、(2、2、2)、(2、2、3)、(2、2、4)、(2、3、3)、(2、3、4)、(2、4、4)、( 3、3、3)、(3、3、4)、(3、4、4)、(4、4、4)]
- 一部は一部のすべてのマルチセットの交差点の大きさは、少なくともある特性を有するマルチセットのリストです
k-1
。つまり、すべてのマルチセットを受け取り、それらを(マルチセットの交差を使用して)一度に交差させます。例[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
として、交差点のサイズが2であるパーツはですが、[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
交差点のサイズが1であるため、そうではありません。
仕事
あなたのコードは2つの引数n
を取る必要がありk
ます。次に、これらのマルチセットをソート順に貪欲に調べ、リストの一部を出力します。この場合n=5, k=3
、正しいパーティション分割は次のとおりです。
(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4)
(0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4)
(0, 2, 2), (0, 2, 3), (0, 2, 4)
(0, 3, 3), (0, 3, 4)
(0, 4, 4)
(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)
(1, 2, 2), (1, 2, 3), (1, 2, 4)
(1, 3, 3), (1, 3, 4)
(1, 4, 4)
(2, 2, 2), (2, 2, 3), (2, 2, 4)
(2, 3, 3), (2, 3, 4)
(2, 4, 4)
(3, 3, 3), (3, 3, 4)
(3, 4, 4), (4, 4, 4)
の別の例を次に示しn = 4, k = 4
ます。
(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)
(0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3)
(0, 0, 2, 2), (0, 0, 2, 3)
(0, 0, 3, 3)
(0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 3)
(0, 1, 2, 2), (0, 1, 2, 3)
(0, 1, 3, 3)
(0, 2, 2, 2), (0, 2, 2, 3)
(0, 2, 3, 3), (0, 3, 3, 3)
(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3)
(1, 1, 2, 2), (1, 1, 2, 3)
(1, 1, 3, 3)
(1, 2, 2, 2), (1, 2, 2, 3)
(1, 2, 3, 3), (1, 3, 3, 3)
(2, 2, 2, 2), (2, 2, 2, 3)
(2, 2, 3, 3), (2, 3, 3, 3)
(3, 3, 3, 3)
貪欲の意味の明確化: 各マルチセットについて、既存のパーツに追加できるかどうかを確認します。できれば追加します。できない場合は、新しい部分を開始します。上記の例のように、ソートされた順序でマルチセットを確認します。
出力
パーティションを好きな形式で出力できます。ただし、マルチセットは1行に水平に記述する必要があります。つまり、個々のマルチセットを縦に書いたり、数行にまたがったりしないでください。出力でパーツの表現を分離する方法を選択できます。
仮定
私たちはそれを仮定することができn >= k > 0
ます。
(0, 4, 4)
それ自体がなぜですか?あなたの説明を与えられれば、私はその「部分」がなると思います(0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
。(0, 0, 3, 3)
2番目のテストケースでも同様です。