Innanzitutto, alcune definizioni:
- Dato
nek, considera l'elenco ordinato dei multiset , dove per ogni multiset scegliamoknumeri{0, 1, ..., n-1}con ripetizioni.
Ad esempio, per n=5e k=3, abbiamo:
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 1), ( 0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 3), (0, 3, 4), (0, 4, 4), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 3), (1, 3, 4), (1, 4, 4) , (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (2, 4, 4), ( 3, 3, 3), (3, 3, 4), (3, 4, 4), (4, 4, 4)]
- Una parte è un elenco di multiset con la proprietà che è almeno la dimensione dell'intersezione di tutti i multiset nella parte
k-1. Cioè prendiamo tutti i multiset e li interseciamo (usando l'intersezione multiset) tutti in una volta. Ad esempio,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]è una parte in quanto la sua intersezione è di dimensione 2, ma[(1, 1, 3),(1, 2, 3),(1, 2, 4)]non lo è, poiché la sua intersezione è di dimensione 1.
Compito
Il tuo codice dovrebbe prendere due argomenti ne k. Dovrebbe quindi passare avidamente attraverso questi multiset in ordine ordinato e produrre le parti dell'elenco. Per il caso n=5, k=3, il partizionamento corretto è:
(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4)
(0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4)
(0, 2, 2), (0, 2, 3), (0, 2, 4)
(0, 3, 3), (0, 3, 4)
(0, 4, 4)
(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)
(1, 2, 2), (1, 2, 3), (1, 2, 4)
(1, 3, 3), (1, 3, 4)
(1, 4, 4)
(2, 2, 2), (2, 2, 3), (2, 2, 4)
(2, 3, 3), (2, 3, 4)
(2, 4, 4)
(3, 3, 3), (3, 3, 4)
(3, 4, 4), (4, 4, 4)
Ecco un altro esempio per n = 4, k = 4.
(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)
(0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3)
(0, 0, 2, 2), (0, 0, 2, 3)
(0, 0, 3, 3)
(0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 3)
(0, 1, 2, 2), (0, 1, 2, 3)
(0, 1, 3, 3)
(0, 2, 2, 2), (0, 2, 2, 3)
(0, 2, 3, 3), (0, 3, 3, 3)
(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3)
(1, 1, 2, 2), (1, 1, 2, 3)
(1, 1, 3, 3)
(1, 2, 2, 2), (1, 2, 2, 3)
(1, 2, 3, 3), (1, 3, 3, 3)
(2, 2, 2, 2), (2, 2, 2, 3)
(2, 2, 3, 3), (2, 3, 3, 3)
(3, 3, 3, 3)
Chiarimento su ciò che significa avido: per ogni multiset a sua volta cerchiamo di vedere se può essere aggiunto alla parte esistente. Se è possibile, lo aggiungiamo. In caso contrario, iniziamo una nuova parte. Esaminiamo i multiset in ordine ordinato come nell'esempio sopra riportato.
Produzione
È possibile produrre il partizionamento in qualsiasi formato sensibile che ti piace. Tuttavia, i multiset devono essere scritti in orizzontale su una riga. Questo è un singolo multiset non deve essere scritto verticalmente o distribuito su più righe. È possibile scegliere come separare la rappresentazione delle parti nell'output.
ipotesi
Possiamo supporre che n >= k > 0.
(0, 4, 4)da solo? Data la tua descrizione, penso che la sua "parte" sarebbe (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4). Allo stesso modo per (0, 0, 3, 3)il secondo caso di test.