Zunächst einige Definitionen:
- Gegeben
n
undk
betrachten Sie die sortierte Liste der Multisets , wobei wir für jedes Multisetk
Zahlen{0, 1, ..., n-1}
mit Wiederholungen auswählen .
Zum Beispiel für n=5
und k=3
haben wir:
[(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)]
- Ein Teil ist eine Liste von Multisets mit der Eigenschaft, dass die Größe des Schnittpunkts aller Multisets im Teil mindestens beträgt
k-1
. Das heißt, wir nehmen alle Multisets und schneiden sie (unter Verwendung der Multiset-Schnittmenge) auf einmal. Als Beispiel[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
ist ein Teil, da sein Schnittpunkt die Größe 2 hat, aber[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
nicht, weil sein Schnittpunkt die Größe 1 hat.
Aufgabe
Ihr Code sollte zwei Argumente n
und k
. Es sollte dann diese Multisets gierig in sortierter Reihenfolge durchgehen und die Teile der Liste ausgeben. Für den Fall n=5, k=3
lautet die richtige Partitionierung:
(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)
Hier ist ein weiteres Beispiel für 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)
Klarstellung, was gierig bedeutet: Für jedes Multiset prüfen wir wiederum, ob es dem vorhandenen Teil hinzugefügt werden kann. Wenn es geht, fügen wir es hinzu. Wenn es nicht geht, beginnen wir ein neues Teil. Wir betrachten die Multisets in sortierter Reihenfolge wie im obigen Beispiel.
Ausgabe
Sie können die Partitionierung in einem beliebigen Format ausgeben. Multisets sollten jedoch horizontal in eine Zeile geschrieben werden. Das heißt, ein einzelnes Multiset sollte nicht vertikal geschrieben oder über mehrere Zeilen verteilt werden. Sie können auswählen, wie Sie die Darstellung von Teilen in der Ausgabe trennen möchten.
Annahmen
Das können wir annehmen n >= k > 0
.
(0, 4, 4)
? Angesichts Ihrer Beschreibung würde ich denken, dass sein "Teil" wäre (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
. Ähnliches gilt für (0, 0, 3, 3)
den zweiten Testfall.