O problema de troca de moedas está muito bem documentado. Dada uma fonte infinita de moedas de denominações x_1
para x_m
você precisa encontrar o número de combinações que somam y
. Por exemplo, dado x = {1,2,3}
e y = 4
temos quatro combinações:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
Introdução
Existem várias variações do problema de troca de moedas. Nesta variação, temos duas restrições adicionais:
- Toda denominação deve ser usada pelo menos uma vez.
- Exatamente um número fixo de moedas deve ser usado no total.
Por exemplo, dada x = {1,2,3}
, y = 36
e n = 15
onde n
é o número total de moedas que devem ser usados, temos quatro combinações:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1, 7, 7){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2, 5, 8){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3, 3, 9){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4, 1, 2, 3)
Desafio
O desafio é escrever uma função enumerate
no idioma de sua escolha que enumere todas as combinações conforme descrito acima:
- A lista de denominações. Por exemplo
{1,5,10,25}
. Você pode usar listas ou matrizes. - Um número inteiro não negativo
y
que indica a soma de todas as combinações. - Um número inteiro não negativo
n
que indica o número total de moedas.
A ordem dos argumentos não importa. Funções pointfree são permitidas.
A saída da enumerate
função deve ser uma lista de combinações. Cada combinação deve ser única e deve ser uma lista de n
números inteiros que somam y
. Toda denominação deve aparecer pelo menos uma vez em cada combinação e nenhuma combinação deve estar faltando. A ordem dos números inteiros e as combinações não importa. Você pode usar listas ou matrizes para a saída.
Lembre-se dos seguintes casos extremos:
- Se ambos
y
en
são iguais a zero e a lista de denominações está vazia, então a saída é uma lista de uma combinação, a combinação vazio (ou seja{{}}
). - Caso contrário, se
y
for zero,n
for zero ou a lista de denominações estiver vazia, a saída será uma lista de combinações zero (ou seja{}
). - De um modo mais geral, se
y
for menor que a soma das denominações oun
menor que o número de denominações, a saída será uma lista de combinações zero.
A pontuação será baseada no tamanho do programa inteiro em bytes. Observe que isso inclui a enumerate
função, funções auxiliares, instruções de importação, etc. Não inclui casos de teste.
y
for menor que a soma das denominações, em algum momento da sua solução recursiva, você alcançará o caso base em que a lista de denominações está vazia. Portanto, a resposta será {}
(ou seja, nenhuma solução encontrada). Se n
for menor que o número de denominações, você finalmente alcançará o caso base onde n = 0
mas y != 0
. Portanto, a resposta será novamente {}
.