Najpierw kilka definicji:
- Biorąc pod uwagę
nik, rozważ posortowaną listę multisetów , gdzie dla każdego multisetu wybieramykliczby{0, 1, ..., n-1}z powtórzeniami.
Na przykład dla n=5i k=3mamy:
[(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 ni k. Następnie powinien łapczywie przejrzeć te multisety w posortowanej kolejności i wypisać części listy. W takim przypadku n=5, k=3poprawne 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.