El problema del cambio de monedas está muy bien documentado. Dado un suministro infinito de monedas de denominaciones x_1que x_mes necesario encontrar el número de combinaciones que suman y. Por ejemplo, dado x = {1,2,3}y y = 4tenemos cuatro combinaciones:
{1,1,1,1}{1,1,2}{1,3}{2,2}
Introducción
Hay varias variaciones del problema del cambio de monedas. En esta variación tenemos dos restricciones adicionales:
- Cada denominación debe usarse al menos una vez.
- Se debe usar exactamente un número fijo de monedas en total.
Por ejemplo, dado x = {1,2,3}, y = 36y n = 15dónde nestá el número total de monedas que se deben usar, obtenemos cuatro combinaciones:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}(1 uno, 7 dos, 7 tres){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}(2 unidades, 5 dos, 8 tres){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}(3 unos, 3 dos, 9 tres){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}(4 unidades, 1 dos, 10 tres)
Desafío
El desafío es escribir una función enumerateen el idioma de su elección que enumere todas las combinaciones como se describe anteriormente:
- La lista de denominaciones. Por ejemplo
{1,5,10,25}. Puede usar listas o matrices. - Un entero no negativo
yque denota la suma de cada combinación. - Un entero no negativo
nque denota el número total de monedas.
El orden de los argumentos no importa. Se permiten funciones de punto libre.
La salida de la enumeratefunción debe ser una lista de combinaciones. Cada combinación debe ser única y debe ser una lista de nenteros que sumen y. Cada denominación debe aparecer al menos una vez en cada combinación y no debe faltar ninguna combinación. El orden de los enteros y las combinaciones no importa. Puede usar listas o matrices para la salida.
Tenga en cuenta los siguientes casos límite:
- Si ambos
yynson cero y la lista de denominaciones está vacía, la salida es una lista de una combinación, la combinación vacía (es decir{{}}). - De lo contrario, si
yes cero,nes cero o la lista de denominaciones está vacía, la salida es una lista de combinaciones cero (es decir{}). - De manera más general, si
yes menor que la suma de las denominaciones ones menor que el número de denominaciones, entonces el resultado es una lista de combinaciones cero.
La puntuación se basará en el tamaño de todo el programa en bytes. Tenga en cuenta que esto incluye la enumeratefunción, funciones auxiliares, declaraciones de importación, etc. No incluye casos de prueba.
yes menor que la suma de las denominaciones, en algún momento de su solución recursiva alcanzará el caso base donde la lista de denominaciones está vacía. Por lo tanto, la respuesta será {}(es decir, no se encontró solución). Si nes menor que el número de denominaciones, eventualmente llegará al caso base donde n = 0pero y != 0. Por lo tanto, la respuesta será nuevamente {}.