Une partition vectorielle divise un vecteur en une série de vecteurs de telle sorte que leur somme soit l'original. Voici quelques partitions:
[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]
Ici, l'ajout de vecteur se fait par élément. Une partition valide ne contient aucun vecteur avec des nombres entiers négatifs ou le vecteur tout à zéro.
Maintenant, le défi consiste à écrire un programme ou une fonction qui génère toutes les partitions vectorielles possibles étant donné un vecteur cible. Cela peut sembler relativement facile ...
... mais il y a une torsion. Si le vecteur d'entrée a la taille L et que la plus grande partition qu'il génère a M éléments, vous ne pouvez pas utiliser plus de mémoire O (L * M).
Vous pouvez supposer qu'un entier utilise la mémoire O (1). Cela signifie que vous devez générer les partitions lors de leur génération. De plus, vous ne devez sortir chaque partition qu'une seule fois. Par exemple, ce sont la même partition:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Si vous deviez sortir les deux, votre réponse n'est pas valide.
Toutes les partitions pour [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]
Pour tester votre réponse, exécutez-la [3, 2, 5, 2]
. Il doit générer 17939 partitions, qui se résument toutes à [3, 2, 5, 2]
, et qui sont toutes uniques (vous pouvez tester l'unicité en triant d'abord chaque partition lexicographiquement).
Le code le plus court en octets gagne.