Eine Vektorpartition teilt einen Vektor in eine Reihe von Vektoren auf, sodass deren Summe das Original ist. Hier sind ein paar Partitionen:
[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]
Hier erfolgt die Vektoraddition elementweise. Eine gültige Partition enthält keine Vektoren mit negativen ganzen Zahlen oder den Nullvektor.
Die Herausforderung besteht nun darin, ein Programm oder eine Funktion zu schreiben, die alle möglichen Vektorpartitionen für einen Zielvektor generiert. Das mag relativ einfach klingen ...
... aber es gibt eine Wendung. Wenn der Eingabevektor die Größe L hat und die größte Partition, die er generiert, M Elemente hat, dürfen Sie nicht mehr als O (L * M) Speicher verwenden.
Sie können davon ausgehen, dass eine Ganzzahl O (1) Speicher verwendet. Dies bedeutet, dass Sie die Partitionen beim Generieren ausgeben müssen. Außerdem müssen Sie jede Partition genau einmal ausgeben. Dies sind zum Beispiel die gleichen Partitionen:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Wenn Sie beide ausgeben, ist Ihre Antwort ungültig.
Alle Partitionen für [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]
Um Ihre Antwort zu testen, führen Sie sie aus [3, 2, 5, 2]
. Es sollte 17939 Partitionen generieren, von denen alle die Summe [3, 2, 5, 2]
bilden und die alle eindeutig sind (Sie können die Eindeutigkeit testen, indem Sie zuerst jede Partition lexikografisch sortieren).
Kürzester Code in Bytes gewinnt.