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.
fuente

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). Sines menor que el número de denominaciones, eventualmente llegará al caso base donden = 0peroy != 0. Por lo tanto, la respuesta será nuevamente{}.Respuestas:
05AB1E, 20 bytes
De entrada está en el orden:
list of values,nr of coins,sum to reach.Explicación en resumen
final length - length of unique coin listPruébalo en línea
El compilador en línea no puede manejar una gran cantidad de monedas.
fuente
MATL , 22 bytes
El orden de entrada es: conjunto de denominaciones, número de monedas tomadas (
n), suma deseada (y).Cada combinación se muestra en una línea diferente. La salida vacía se muestra como una cadena vacía (por lo tanto, nada).
Pruébalo en línea!
El código se queda sin memoria en el compilador en línea para el ejemplo en el desafío, pero funciona sin conexión con una computadora estándar, razonablemente moderna:
Explicación
fuente
Python 3,
120106 bytesUna función anónima que toma la entrada de una tupla de denominaciones de la forma
(x_1, x_2, x_3 ... , x_k), un valor objetivo y varias monedas mediante un argumento, y devuelve una lista de tuplas de la forma[(solution_1), (solution_2), (solution_3), ... (solution_k)].Cómo funciona
ItertoolsLacombinations_with_replacementfunción de se utiliza para generar todas lasl-len(d)combinaciones, con reemplazo, de las denominaciones. Al agregarda cada una de estas combinaciones, se garantiza que cada denominación aparece al menos una vez, y que la nueva combinación tiene longitudl. Si los elementos de una combinación sumant, la combinación se agrega a la lista de retorno como una tupla.Pruébalo en Ideone
Un método alternativo para 108 bytes.
Una función anónima que toma la entrada de una tupla de denominaciones de la forma
(x_1, x_2, x_3 ... , x_k), un valor objetivo y varias monedas mediante un argumento, y devuelve un conjunto de tuplas de la forma{(solution_1), (solution_2), (solution_3), ... (solution_k)}.Cómo funciona (otra versión)
Esto utiliza la
productfunción deitertoolspara generar todos losl-len(d)arreglos de las denominaciones. Al agregarda cada una de estas combinaciones, se garantiza que cada denominación aparece al menos una vez, y que la nueva combinación tiene longitudl. Si los elementos de una combinación sumant, la combinación se ordena, se convierte de una lista a una tupla y se agrega a las tuplas de retorno. Finalmente, llamarsetelimina cualquier duplicado.Pruébalo en Ideone (otra versión)
fuente
JavaScript (ES6), 135 bytes
fuente