Primeiro, algumas definições:
- Dado
n
ek
, considere a lista classificada de multisets , onde, para cada multiset, escolhemosk
números{0, 1, ..., n-1}
com repetições.
Por exemplo, para n=5
e k=3
, temos:
[(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)]
- Uma parte é uma lista de multisets com a propriedade de pelo menos o tamanho da interseção de todos os multisets da peça
k-1
. Ou seja, pegamos todos os multisets e os cruzamos (usando a interseção multiset) de uma só vez. Como exemplos,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
é uma parte, pois sua interseção é do tamanho 2, mas[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
não é, porque sua interseção é do tamanho 1.
Tarefa
Seu código deve receber dois argumentos n
e k
. Ele deve avidamente percorrer esses multisets na ordem classificada e exibir as partes da lista. Para o caso n=5, k=3
, o particionamento correto é:
(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)
Aqui está outro exemplo para 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)
Esclarecimento sobre o que significa ganancioso: Para cada multiset, por sua vez, procuramos ver se ele pode ser adicionado à peça existente. Se pudermos adicioná-lo. Se não pudermos, começamos uma nova peça. Observamos os multisets na ordem classificada, como no exemplo acima.
Resultado
Você pode gerar o particionamento em qualquer formato que desejar. No entanto, multisets devem ser escritos horizontalmente em uma linha. Esse é um conjunto múltiplo individual não deve ser gravado verticalmente ou espalhado por várias linhas. Você pode escolher como separa a representação de peças na saída.
Premissas
Nós podemos assumir isso n >= k > 0
.
(0, 4, 4)
por si só? Dada a sua descrição, eu acho que seria a sua "parte" (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
. Da mesma forma, (0, 0, 3, 3)
no segundo caso de teste.