Necesito ir al banco y retirar algo de dinero. Necesito retirar $ 30, $ 22 para pagarle a mi compañero de cuarto por internet y $ 8 para lavar la ropa. Como ninguno de estos puede cambiar, necesito que mis $ 30 se dividan en dos particiones de los dos tamaños. Eso significa que cuando el cajero me pregunte cómo quiero mis $ 30 voy a tener que hacer una solicitud. Podría decirles que lo quiero en veinte, cinco y cinco unidades. Pero quiero hacer mi solicitud lo más simple posible para evitar tener que repetirme. Para simplificar mi solicitud, podría pedir que mi efectivo contenga veinte y al menos 2 unidades porque el 8 está implícito en el total, pero mejor aún, podría simplemente solicitar que una de las facturas que reciba sea un billete de un dólar (si usted No está convencido de esto, solo trate de ganar 29 dólares sin ganar 8).
Así que todo está bien, pero necesito hacer este cálculo cada vez que voy al banco, así que pensé en escribir un programa para hacer esto (¿tienes que escribir un programa para hacer esto por mí?).
Su programa o función debe tomar una lista de enteros que represente todos los pagos que necesito hacer y un conjunto de enteros que representen las denominaciones de billetes disponibles en el banco, y debe generar la lista más pequeña de denominaciones de tal manera que se pueda hacer el total eso incluye que la lista de denominaciones se puede dividir limpiamente en la lista de pagos.
Reglas extra
Puede suponer que la lista de denominaciones siempre contendrá una
1
o puede agregarla a cada lista usted mismo.Algunas entradas tendrán múltiples soluciones mínimas. En estos casos, puede generar cualquiera de los dos.
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, siendo mejores menos bytes.
Casos de prueba
Payments, denominations -> requests
{22,8} {1,2,5,10,20,50} -> {1} or {2}
{2,1,2} {1,5} -> {1}
{20,10} {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2} -> {1,1,1}
{20,6} {1,4,5} -> {1}
{2,6} {1,2,7} -> {2}
{22, 11} {1, 3, 30, 50} -> {1, 3}
{44, 22} {1, 3, 30, 50} -> {1, 3, 3, 30}
{2,6} {1,2,7} -> {2}
.(If you are not convinced of this just try to make 29 dollars without making 9)
¿Quieres decir sin hacer 8? ¿O no entendí mal?Respuestas:
JavaScript (ES6),
485476 bytesMuy bien ... esto es un monstruo. :-(
Pero es un monstruo bastante rápido que resuelve todos los casos de prueba casi al instante.
Puede que intente jugar golf más avanzado más tarde, pero ya he dedicado demasiado tiempo a ello.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
NB: Esto ya no coincide con la versión actual, pero es mucho más fácil de leer de esa manera.
fuente
&&
to&
y el||
to|
?a || b
evaluaráb
solo sia
es falso, mientrasa | b
que incondicionalmente realizará un OR bit a bit entrea
yb
.Python 2 ,
456455 bytes¡Extremadamente, extremadamente, extremadamente lento! Debería funcionar correctamente en todos los ejemplos de entrada con tiempo suficiente
Editar: guardado 1 byte gracias a @Jonathan Frech
Pruébalo en línea!
Explicación
fuente
input()
es un byte más corto .