Innanzitutto, alcune definizioni:
- Dato
n
ek
, considera l'elenco ordinato dei multiset , dove per ogni multiset scegliamok
numeri{0, 1, ..., n-1}
con ripetizioni.
Ad esempio, per n=5
e 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 n
e 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.