Partycja wektorowa dzieli wektor na serię wektorów, tak że ich suma jest oryginalna. Oto kilka partycji:
[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]
Tutaj dodawanie wektorów odbywa się elementarnie. Prawidłowa partycja nie zawiera żadnych wektorów z ujemnymi liczbami całkowitymi lub całkowicie zerowym wektorem.
Teraz wyzwaniem jest napisanie programu lub funkcji, która generuje wszystkie możliwe partycje wektorowe na podstawie wektora docelowego. To może brzmieć stosunkowo łatwo ...
... ale jest zwrot. Jeśli wektor wejściowy ma rozmiar L, a największa generowana partycja ma M elementów, nie można użyć więcej niż pamięci O (L * M).
Możesz założyć, że liczba całkowita używa pamięci O (1). Oznacza to, że musisz generować partycje podczas ich generowania. Ponadto każdą partycję należy wypisać tylko raz. Na przykład są to ta sama partycja:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Jeśli miałbyś wypisać, Twoja odpowiedź jest nieprawidłowa.
Wszystkie partycje dla [3, 2]
:
[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]
Aby przetestować swoją odpowiedź, uruchom ją [3, 2, 5, 2]
. Powinien wygenerować 17939 partycji, z których wszystkie są sumowane [3, 2, 5, 2]
i wszystkie są unikalne (możesz przetestować unikalność, najpierw sortując każdą partycję leksykograficznie).
Najkrótszy kod w bajtach wygrywa.