Una partizione vettoriale sta dividendo un vettore in una serie di vettori in modo tale che la loro somma sia l'originale. Ecco un paio di partizioni:
[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]
Qui l'aggiunta vettoriale viene eseguita in base all'elemento. Una partizione valida non contiene vettori con numeri interi negativi o il vettore tutto zero.
Ora la sfida è scrivere un programma o una funzione che generi tutte le possibili partizioni vettoriali dati un vettore target. Questo può sembrare relativamente facile ...
... ma c'è una svolta. Se il vettore di input ha dimensione L e la partizione più grande che genera ha elementi M, non è possibile utilizzare più della memoria O (L * M).
Si può presumere che un numero intero utilizzi la memoria O (1). Questo significa che devi generare le partizioni mentre le generi. Inoltre, è necessario generare ogni partizione esattamente una volta. Ad esempio, queste sono la stessa partizione:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Se dovessi produrre entrambe le risposte non è valido.
Tutte le partizioni per [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]
Per testare la tua risposta, eseguila [3, 2, 5, 2]
. Dovrebbe generare 17939 partizioni, tutte sommate a [3, 2, 5, 2]
, e che sono tutte uniche (è possibile verificare l'univocità ordinando prima ogni partizione lessicograficamente).
Vince il codice più breve in byte.