Najpierw kilka definicji:
- Biorąc pod uwagę
n
ik
, rozważ posortowaną listę multisetów , gdzie dla każdego multisetu wybieramyk
liczby{0, 1, ..., n-1}
z powtórzeniami.
Na przykład dla n=5
i k=3
mamy:
[(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)]
- Częścią jest lista multisets z własności, że wielkość przecięcia wszystkich multisets w części wynosi co najmniej
k-1
. To znaczy, że bierzemy wszystkie multisety i przecinamy je (używając przecięcia multiset) jednocześnie. Jako przykład,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
jest częścią, ponieważ jej przecięcie ma rozmiar 2, ale[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
nie jest, ponieważ jego przecięcie ma rozmiar 1.
Zadanie
Twój kod powinien przyjąć dwa argumenty n
i k
. Następnie powinien łapczywie przejrzeć te multisety w posortowanej kolejności i wypisać części listy. W takim przypadku n=5, k=3
poprawne partycjonowanie to:
(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)
Oto kolejny przykład 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)
Wyjaśnienie, co oznacza chciwość : Z kolei dla każdego zbioru wielosetowego sprawdzamy, czy można go dodać do istniejącej części. Jeśli tak, możemy to dodać. Jeśli nie, zaczniemy nową część. Patrzymy na multisety w posortowanej kolejności, jak w przykładzie podanym powyżej.
Wynik
Możesz wydzielić partycjonowanie w dowolnym rozsądnym formacie, jaki ci się podoba. Jednak multisety powinny być zapisywane poziomo w jednym wierszu. Oznacza to, że pojedynczy multiset nie powinien być zapisywany w pionie ani rozłożony na kilka wierszy. Możesz wybrać sposób oddzielenia reprezentacji części na wyjściu.
Założenia
Możemy to założyć n >= k > 0
.
(0, 4, 4)
sam? Biorąc pod uwagę twój opis, sądzę, że będzie to jego „część” (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
. Podobnie (0, 0, 3, 3)
w drugim przypadku testowym.