Algorithmuspro
Dynamische Programmierung: Münzwechsel
Finde die wenigsten Münzen für einen Betrag, ein Problem, bei dem es schiefgeht, immer die größte Münze zu nehmen.
- Zeit
- O(n·m)
- Speicher
- O(n)
// Schritt für Schritt
Schritt 1 / 15
1function coinChange(coins, amount) {2 const dp = new Array(amount + 1).fill(Infinity);3 dp[0] = 0;4 for (let a = 1; a <= amount; a++) {5 for (const c of coins) {6 if (c <= a && dp[a - c] + 1 < dp[a]) dp[a] = dp[a - c] + 1;7 }8 }9 return dp[amount] === Infinity ? -1 : dp[amount];10}- coins
- = [1, 3, 4]
- 00
- ∞1
- ∞2
- ∞3
- ∞4
- ∞5
- ∞6
dp[0] = 0: Null Münzen ergeben 0. Jeder andere Betrag startet bei ∞, also noch nicht erreichbar.
// pro-lektion
Den ganzen Durchlauf freischalten
Diese Lektion ist Teil von Pro. Pro schaltet jeden Schritt jeder Lektion frei, dazu Muster-Übungen und Fortschrittsauswertungen.
Preise ansehenSo funktioniert es
Mit den Münzen 1, 3 und 4 wählt der gierige Ansatz für 6 die Kombination 4 + 1 + 1, dabei reichen mit 3 + 3 zwei Münzen. Dynamische Programmierung probiert jede Möglichkeit, ohne Arbeit zu wiederholen: dp[a] ist die kleinste Münzanzahl für den Betrag a, und für jede Münze c ist dp[a − c] + 1 ein Kandidat. Fülle dp von 0 bis zum Betrag. O(n·m) Zeit für den Betrag n und m Münzen, und O(n) Speicher.
Dieses Muster erkennen üben →