¿Me pueden ayudar a entender el problema del cambio de moneda?

Digamos que quieres saber la menor cantidad de monedas con las que puedes hacer x centavos. Definimos que F es la función que asigna el número de centavos que tiene al número mínimo de monedas para esa cantidad y, por lo tanto, busca una expresión para F (x).

Consideremos la primera moneda en este conjunto mínimo de monedas. No sabemos qué tipo de moneda será, pero es uno de los tipos de monedas disponibles.

Así que probemos con todos los tipos de monedas posibles. Para cada valor de moneda monedas [i], consideramos tomar ese tipo de moneda. El número mínimo de monedas para obtener x centavos, teniendo en cuenta que primero tomaremos una moneda de valor de monedas [i], entonces sería 1 más el número mínimo de monedas necesarias para obtener x – monedas [i] centavos; es decir, F (monedas x [i]) + 1.

Sin embargo, no sabemos qué moneda debemos tomar, por lo que tenemos que calcular esta cantidad para cada i posible y luego tomar la mejor (la más pequeña) de esas. Por lo tanto,

F (x) = 0 si x = 0 (no necesita monedas para hacer nada)

F (x) = + inf si x <0 (imposible hacer una cantidad negativa)

De otra manera,

F (x) = min sobre todo i de 0 a monedas. Longitud -1 de (F (x-monedas [i]) + 1)

Entonces podemos evaluar esto de forma recursiva. Descubriremos que hay subproblemas superpuestos (muchos de los mismos casos se resuelven una y otra vez en el transcurso de la recursión), por lo que podemos usar la memorización para optimizar el tiempo de ejecución.

También podemos usar la programación dinámica de abajo hacia arriba al observar que F (x) siempre llama a F solo en valores menores que x, por lo que si comenzamos con F (1) y luego subimos de allí a F (2), F (3 ), F (4) etc. y mantener una tabla de valores de F calculados previamente, siempre sabremos los valores de F que necesitamos en cada cálculo.

Bien, supongamos que tiene las siguientes monedas 1, 2, 5.

Lo que tiene que hacer es crear una matriz donde el índice será la cantidad de dinero que desea cambiar, y el valor en ese índice será la cantidad mínima de monedas que necesita para eso. Aquí hay un ejemplo con las monedas de arriba.

[1, 1, 2, 2, 1]

En el índice 1 (comencé a contar desde 1) tiene un 1. Eso significa que necesita 1 moneda para cambiar 1 $ (o la moneda que desee). En el índice dos dice 1 otra vez. ¿Por qué? Porque para cambiar 2 $ necesitas una moneda, una moneda de 2 $. En el índice 3 dice 2 porque el mínimo para cambiar 3 $ es usar 2 monedas: 1 y 2 $.

Ahora supongamos que queremos saber cuál es la cantidad mínima de monedas que necesitamos para cambiar 6 $.

Tenemos todos los valores hasta 6–1, que es 5.

Como tienes 3 monedas, tienes tres opciones:

array [6] = array [5] + 1 (el valor en array [5] más una moneda de un dólar)

O

array [6] = array [4] + 1 (el valor en array [4] más una moneda de dos dólares)

O

array [6] = array [1] + 1 (el valor en array [1] más una moneda de cinco dólares)

¿Cómo obtuvimos estos números? Usted toma la cantidad de dinero que desea cambiar (en nuestro caso, 6 $) y le resta todas las monedas posibles. Terminarás con 5, 4 y 1.

Como ya sabe la cantidad de monedas que necesita para cambiar 5, 4 o 1 $, solo tiene que agregar una a ese número (agregue una moneda, ya sea 1 $, 2 $ o 5 $).

Volvamos al ejemplo. Dice:

matriz [6] = matriz [5] + 1

Ese es igual a 1 (el valor de la matriz en el índice 5; cuántas monedas necesita cambiar 5 $) + 1, que es 2

Entonces dice

matriz [6] = matriz [4] + 1

array [4] es 2 más una moneda de dos dólares es 3

Y la ultima suma

matriz [6] = matriz [1] + 1

array [1] es 1 más 1 = 2

El mínimo de estos 3 es 2. Por lo tanto, necesita 2 monedas para cambiar 6 dólares. Lo cual es correcto porque necesita una moneda de 1 $ y 5 $.

Espero haberte ayudado a entender esto.