Uma partição de vetor está dividindo um vetor em uma série de vetores, de modo que sua soma seja a original. Aqui estão algumas partições:
[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]
Aqui, a adição de vetores é feita em elementos. Uma partição válida não contém nenhum vetor com números inteiros negativos ou o vetor zero.
Agora, o desafio é escrever um programa ou função que gere todas as partições de vetores possíveis, considerando um vetor de destino. Isso pode parecer relativamente fácil ...
... mas há uma torção. Se o vetor de entrada tiver tamanho L e a maior partição gerada tiver elementos M, você não poderá usar mais que memória O (L * M).
Você pode assumir que um número inteiro usa memória O (1). Isso significa que você deve gerar as partições à medida que as gera. Além disso, você deve gerar cada partição exatamente uma vez. Por exemplo, estas são a mesma partição:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
Se você produziu, sua resposta é inválida.
Todas as partições 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 testar sua resposta, execute-o [3, 2, 5, 2]
. Ele deve gerar 17939 partições, todas somadas [3, 2, 5, 2]
e únicas (você pode testar a exclusividade classificando primeiro cada partição lexicograficamente).
O código mais curto em bytes vence.