Serie de planificación dinámica "leetcode322. Cambio de intercambio"

322. Cambio de cambio

Dadas monedas de diferentes denominaciones coinsy un monto total amount. Escribe una función para calcular la cantidad mínima de monedas necesarias para completar la cantidad total. Si ninguna combinación de monedas puede completar la cantidad total, devuélvala -1.

Cambie la convertibilidad de acuerdo con la subestructura óptima, por ejemplo, desea encontrar amount = 11el número mínimo de monedas cuando (la pregunta original), si conoce amount = 10el número mínimo de monedas de Couchu (subproblemas ), la respuesta es que solo necesita agregar un subproblema (reelección Una moneda con un valor nominal de 1) es la respuesta a la pregunta original. Debido a que no hay límite para la cantidad de monedas, no hay restricción mutua entre las subpreguntas, son independientes entre sí.

¿Cómo enumerar la ecuación de transición de estado correcta ?

En primer lugar, debemos aclarar nuestro propósito: usar la menor cantidad de monedas para formar la cantidad objetivo

  1. Determinar el caso base

    Esto es muy simple, aparentemente la cantidad objetivo amountpara el algoritmo devuelve 0:00 porque ninguna moneda ha sido Couchu como la cantidad objetivo.

  2. Determine el "estado", que es la variable que cambiará en el problema y subproblemas originales .

    Dado que el número de monedas es ilimitado, la denominación de la moneda también la da el sujeto, solo la cantidad objetivo seguirá acercándose al caso base, por lo que el único "estado" es la cantidad objetivo amount.

  3. Determine la "elección", es decir, el comportamiento que hace que el "estado" cambie .

    ¿Por qué cambia la cantidad objetivo? Debido a que está eligiendo una moneda, cada moneda que elija equivale a reducir la cantidad objetivo. Así que el valor nominal de todas las monedas es su "elección".

  4. Aclare la definición de la función / matriz .dp

    Aquí directamente en un paso, utilizando un enfoque de abajo hacia arriba, la matriz dp[amount]representa el objetivo cuando la cantidad del amountnúmero mínimo de monedas cuando sea necesario (es decir, la solución final).

    La ecuación de transición de estado es:

    dp (n) = {0, n = 0 - 1, n <0 min {dp (n - moneda) + 1 ∣ moneda ∈ monedas}, n> 0 dp (n) = \ begin {cases} 0, \ quad n = 0 \\ - 1, \ quad n <0 \\ min \ {dp (n-coin) + 1 \ quad | \ quad moneda \ en monedas \}, \ quad n> 0 \ end {cases}d p ( n )=0 ,norte=0- 1 ,norte<0m i n { d p ( n-c o i n )+1c o i nc o i n s } ,norte>0

dp(n)Definición: ingrese una cantidad objetivo n, la cantidad objetivo Couchu devolver nel número mínimo de monedas.

PD: Por qué dpse inicializa la matriz amount + 1, compensar porque amountel número de monedas puede ser igual a una cantidad máxima amount(por 1 yuan con un valor nominal de la moneda), la inicialización es amount + 1equivalente a inicializada en infinito positivo y para facilitar el mínimo posterior valor.

import java.util.*;

class Solution {
    
    
    public int coinChange(int[] coins, int amount) {
    
    
        int[] dp = new int[amount+1];
        Arrays.fill(dp, amount+1);
        dp[0] = 0;
        for(int i = 0; i <= amount; i++){
    
    
            for(int coin:coins){
    
    
                if(i-coin >= 0){
    
    
                    dp[i] = Math.min(dp[i-coin]+1, dp[i]);
                }
            }
        }
        return (dp[amount] == amount+1) ? -1 : dp[amount];
    }
}

Complejidad de tiempo: O(kN), kel número de tipos de denominaciones de monedas

Complejidad espacial:O(N)

Supongo que te gusta

Origin blog.csdn.net/weixin_44471490/article/details/109014424
Recomendado
Clasificación