El problema del cambio de monedas está muy bien documentado. Dado un suministro infinito de monedas de denominaciones x_1
que x_m
es necesario encontrar el número de combinaciones que suman y
. Por ejemplo, dado x = {1,2,3}
y y = 4
tenemos 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 = 36
y n = 15
dónde n
está 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 enumerate
en 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
y
que denota la suma de cada combinación. - Un entero no negativo
n
que denota el número total de monedas.
El orden de los argumentos no importa. Se permiten funciones de punto libre.
La salida de la enumerate
función debe ser una lista de combinaciones. Cada combinación debe ser única y debe ser una lista de n
enteros 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
y
yn
son 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
y
es cero,n
es 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
y
es menor que la suma de las denominaciones on
es 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 enumerate
función, funciones auxiliares, declaraciones de importación, etc. No incluye casos de prueba.
y
es 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 n
es menor que el número de denominaciones, eventualmente llegará al caso base donde n = 0
pero y != 0
. Por lo tanto, la respuesta será nuevamente {}
.