LeetCode 322 — Coin Change

Octavo problema de DP 1-D. Unbounded knapsack: cuántas monedas mínimas para sumar amount, monedas reusables. Es el problema más típico de “DP por valor objetivo”.

Enunciado

Array coins y amount. Devuelve mínimo número de monedas para sumar amount. -1 si imposible.


Solución — DP bottom-up

class Solution:
    def coinChange(self, coins, amount):
        dp = [float('inf')] * (amount + 1)
        dp[0] = 0
        for a in range(1, amount + 1):
            for c in coins:
                if a - c >= 0:
                    dp[a] = min(dp[a], dp[a-c] + 1)
        return dp[amount] if dp[amount] != float('inf') else -1

Análisis: O(amount · n_coins).

Recurrencia

dp[a] = min(dp[a-c] + 1) para cada moneda c ≤ a. Probamos todas las monedas que cabrían como “última moneda usada”, y nos quedamos con el mínimo +1.


Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode