La espada se refiere a la oferta 103: el número mínimo de monedas

Pregunta: Se
entregan monedas de diferentes denominaciones y un monto total. Escribe una función para calcular la cantidad mínima de monedas necesarias para completar la cantidad total. Devuelve -1 si ninguna de las combinaciones de monedas constituye la cantidad total.
Puedes pensar en una cantidad infinita de cada tipo de moneda.
Ejemplo 1:
Entrada: monedas = [1, 2, 5], cantidad = 11
Salida: 3
Explicación: 11 = 5 + 5 + 1
Ejemplo 2:
Entrada: monedas = [2], cantidad = 3
Salida: -1
Ejemplo 3 :
Entrada: monedas = [1], cantidad = 0
Salida: 0
Ejemplo 4:
Entrada: monedas = [1], cantidad = 1
Salida: 1
Ejemplo 5:
Entrada: monedas = [1], cantidad = 2
Salida: 2
Análisis :
Considere las monedas de cada denominación como un artículo, y la cantidad objetivo como la capacidad de la mochila, entonces este problema es equivalente a encontrar la cantidad mínima de artículos cuando la mochila está llena, vale la pena señalar que las monedas de cada denominación se puede usar cualquier número de veces, por lo que el problema ya no es un problema de mochila 0-1, sino un problema de mochila ilimitado. (también llamado el problema de la mochila completa)
Use la función f(i,j) para indicar el número mínimo de monedas requeridas para las primeras i monedas (monedas[0,...,i-1]) para hacer un total de j. Cuando use 0 monedas etiquetadas como i -1, f(i,j)=f(i-1,j), cuando se usa una moneda con la etiqueta i-1, f(i,j) es igual a f(i-1,j-monedas[i-1 ] )+1, y así sucesivamente. Cuando se usan k monedas con la etiqueta i-1, f(i,j) es igual a f(i-1,jk monedas[i-1])+k (usando la primera i-1 monedas La cantidad mínima de monedas requerida para formar la cantidad total jk monedas[i-1], y luego suponga k monedas etiquetadas como i-1), ya que el objetivo es encontrar la cantidad mínima de monedas, f(i, j) es el Mínimo anterior de todos los casos:
inserte la descripción de la imagen aquí
si hay n monedas y el total objetivo es t, entonces f(n,t) es la solución al problema.
Cuando j=0, es decir, el monto total es 0, f(i, 0)=0, es decir, se seleccionan 0 monedas de los primeros i tipos de monedas, de manera que el monto total es igual a 0. Cuando i es igual a 0 y j es mayor que 0, es decir, obviamente es imposible usar 0 monedas para hacer un total mayor que 0, por lo que se puede usar un valor especial en su lugar.
La segunda idea:
inserte la descripción de la imagen aquí
es equivalente a calcular de derecha a izquierda horizontalmente. Este método es similar a contar de arriba a abajo. Después de calcular una columna, se calcula la siguiente columna y se usa la función f(i) para indicar la cantidad mínima de monedas requerida para formar un total de i. Cabe señalar que esta función tiene solo un parámetro i que representa la cantidad total de monedas. Si la cantidad total objetivo es t, entonces f(t) es la solución de la todo el problema
Código:

import java.util.Arrays;

public class CoinChange {
    
    
//    第一种思路
    public int coinChange1(int[] coins, int amount) {
    
    
        int[] dp = new int[amount+1];
        Arrays.fill(dp,amount+1);
        dp[0] = 0;
        for (int coin : coins) {
    
    
            for (int j = amount; j >=1; j--) {
    
    
                for (int k = 1; k*coin <=j; k++) {
    
    
                    dp[j] = Math.min(dp[j],dp[j-k*coin]+k);
                }
            }
        }
        return dp[amount] > amount ?-1:dp[amount];
    }
//    第二种思路
//
    public int coinChange2(int[] coins, int amount){
    
    
        int[] dp = new int[amount+1];
//        i代表总额,dp[i]代表凑出总额为i的最少硬币数目
        for (int i = 1; i <=amount; i++) {
    
    
            dp[i] = amount+1;
            for (int coin:coins){
    
    
//                如果总额度大于等于该硬币的值
                if (i>=coin){
    
    
                    dp[i] = Math.min(dp[i],dp[i-coin]+1);
                }
            }
        }
        return dp[amount]>amount ?-1:dp[amount];
    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Jiaodaqiaobiluo/article/details/123336382
Recomendado
Clasificación