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.
fuente
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). Sin
es menor que el número de denominaciones, eventualmente llegará al caso base donden = 0
peroy != 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 list
Prué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
Itertools
Lacombinations_with_replacement
función de se utiliza para generar todas lasl-len(d)
combinaciones, con reemplazo, de las denominaciones. Al agregard
a 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
product
función deitertools
para generar todos losl-len(d)
arreglos de las denominaciones. Al agregard
a 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, llamarset
elimina cualquier duplicado.Pruébalo en Ideone (otra versión)
fuente
JavaScript (ES6), 135 bytes
fuente