O problema de troca de moedas está muito bem documentado. Dada uma fonte infinita de moedas de denominações x_1para x_mvocê precisa encontrar o número de combinações que somam y. Por exemplo, dado x = {1,2,3}e y = 4temos 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 = 36e n = 15onde 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 enumerateno 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
yque indica a soma de todas as combinações. - Um número inteiro não negativo
nque indica o número total de moedas.
A ordem dos argumentos não importa. Funções pointfree são permitidas.
A saída da enumeratefunção deve ser uma lista de combinações. Cada combinação deve ser única e deve ser uma lista de nnú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
yensã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
yfor zero,nfor 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
yfor menor que a soma das denominações ounmenor 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 enumeratefunção, funções auxiliares, instruções de importação, etc. Não inclui casos de teste.
yfor 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 nfor menor que o número de denominações, você finalmente alcançará o caso base onde n = 0mas y != 0. Portanto, a resposta será novamente {}.