Aller au contenu
  1. Algorithmes & Structures de données/
#77 DP Moyen 2 min de lecture

Coin Change

Avec des pièces de valeurs données (quantité illimitée), quel est le NOMBRE MINIMAL de pièces pour atteindre exactement un montant ? (-1 si impossible). Ex : coins=[1,2,5], amount=11 → 3 (5+5+1).

🐻 Vocabulaire pas clair ? Consultez le glossaire algo.

C’est quoi le problème, en clair ? #

Vous avez des pièces de plusieurs valeurs, en quantité illimitée, et un montant précis à atteindre. On vous demande le plus petit nombre de pièces possible pour y arriver, ou de dire que c’est impossible. Le piège classique est de croire qu’il suffit de toujours prendre la plus grosse pièce disponible, comme un caissier qui rend la monnaie sans réfléchir : ça ne marche pas toujours, et il faut en réalité calculer, montant par montant, la meilleure combinaison possible.

L’idée clé #

Le glouton (prendre la plus grosse pièce) ÉCHOUE : coins=[1,3,4], amount=6 → glouton donne 4+1+1 (3 pièces) au lieu de 3+3 (2). Il faut la DP : dp[m] = nombre minimal de pièces pour le montant m = 1 + min(dp[m - pièce]) sur toutes les pièces utilisables. On remplit de 0 à amount.

Pourquoi cette solution ? #

Tableau dp[amount+1] initialisé à amount+1 (valeur « infini » sûre, sans overflow d’Integer.MAX_VALUE + 1). Montrer le contre-exemple du glouton AVANT de coder la DP est un moment fort d’entretien : ça prouve que tu testes tes intuitions.

Solution Java #

class Solution {
    public int coinChange(int[] coins, int amount) {
        int INF = amount + 1; // "infini" : plus que le pire cas possible
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, INF);
        dp[0] = 0; // 0 piece pour le montant 0

        for (int m = 1; m <= amount; m++) {
            for (int coin : coins) {
                if (coin <= m) {
                    // Utiliser cette piece + la meilleure solution du reste
                    dp[m] = Math.min(dp[m], dp[m - coin] + 1);
                }
            }
        }
        return dp[amount] == INF ? -1 : dp[amount];
    }
}

Complexité #

Temps O(amount × nb de pièces) : double boucle. Espace O(amount) pour le tableau dp.