Una partición de vector está dividiendo un vector en una serie de vectores de modo que su suma sea la original. Aquí hay un par de particiones:
[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]
Aquí la adición de vectores se realiza por elementos. Una partición válida no contiene ningún vector con enteros negativos, o el vector todo cero.
Ahora el desafío es escribir un programa o función que genere todas las particiones de vectores posibles dado un vector de destino. Esto puede sonar relativamente fácil ...
...Pero hay un giro. Si el vector de entrada tiene el tamaño L, y la partición más grande que genera tiene elementos M, no puede usar más que la memoria O (L * M).
Puede suponer que un entero usa la memoria O (1). Esto significa que debe generar las particiones a medida que las genera. Además de eso, solo debe generar cada partición exactamente una vez. Por ejemplo, estas son la misma partición:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Si tuviera que dar salida a ambos, su respuesta no es válida.
Todas las particiones para [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]
Para probar tu respuesta, ejecútala [3, 2, 5, 2]
. Debería generar 17939 particiones, todas las cuales suman [3, 2, 5, 2]
, y que son todas únicas (puede probar la unicidad ordenando primero cada partición lexicográficamente).
El código más corto en bytes gana.