Competitive Programming Academy · Les

Onbegrensde knapsack en coin-change-DP

Items een willekeurig aantal keer gebruiken

Les 3 van 413 stappen

Onbegrensde knapsack en coin-change-DP is een gratis Competitive Programming Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Competitive Programming Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Competitive Programming Academy bevat in totaal 4 lessen.

Onbeperkte voorwerpen

In het onbeperkte knapzakprobleem kun je elk voorwerp zo vaak meenemen als je wilt. Denk aan munten in een automaat, niet aan een vaste stapel.

De ene kleine wijziging

Vergeleken met 0/1 verandert alleen de richting van de lus. Bij onbeperkte voorwerpen doorloop je de capaciteit vooruit, van laag naar hoog.

Vooruit hergebruiken is juist de bedoeling

Als je vooruitgaat, kan dp[w - coin] ditzelfde voorwerp al bevatten. Dat opzettelijke hergebruik maakt het precies mogelijk om het opnieuw mee te nemen.

Maak kennis met het muntwisselprobleem

Het klassieke muntwisselprobleem vraagt naar het kleinste aantal munten dat samen een bedrag vormt. Het is onbeperkte DP met een minimum in plaats van een maximum.

Definieer de toestand

Laat dp[a] het kleinste aantal munten zijn dat nodig is om bedrag a te maken. Begin met dp[0] = 0, want voor nul zijn geen munten nodig.

dp = [float("inf")] * (amount + 1)
dp[0] = 0

Gebruik oneindig voor onmogelijke bedragen

Onbereikbare bedragen beginnen als oneindig. Als een bedrag aan het einde oneindig blijft, kan geen enkele combinatie van munten het vormen.

De overgang

Probeer voor elke munt elk bedrag dat je ermee kunt bereiken te verbeteren. Gebruik één munt meer dan het kleinere overgebleven bedrag.

for coin in coins:
    for a in range(coin, amount + 1):
        dp[a] = min(dp[a], dp[a - coin] + 1)

Waarom de volgorde vooruit is

Door de bedragen oplopend te doorlopen, telt dp[a - coin] deze munt al mee. Zo kan één munt meerdere keren bijdragen.

Tel in plaats daarvan de manieren

Vervang min+1 door een som om het aantal manieren te tellen waarop je elk bedrag kunt maken. Met de muntlus buitenom voorkom je dat je volgordes dubbel telt.

for coin in coins:
    for a in range(coin, amount + 1):
        dp[a] += dp[a - coin]

Lees het resultaat af

Je antwoord staat in dp[amount]. In de minimumvariant betekent een oneindige waarde dat het doelbedrag niet kan worden gevormd.

0/1 versus onbeperkt

Onthoud de ene omschakeling: een capaciteit die achteruit loopt betekent elk voorwerp één keer, vooruit betekent onbeperkt. Dezelfde tabel, tegengestelde doorlooprichting.

Snelle controle

Test waardoor het knapzakprobleem onbeperkt wordt.

Samenvatting

Je hebt de lus vooruit gedraaid voor onbeperkt hergebruik en muntwisselen opgebouwd met een minimum voor het kleinste aantal munten of een som voor het totale aantal manieren. 💰

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Onbegrensde knapsack en coin-change-DP” gratis?

Ja — de volledige tekst van “Onbegrensde knapsack en coin-change-DP” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Competitive Programming Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Competitive Programming Academy bevat in totaal 4 lessen.

Wat leer ik in “Onbegrensde knapsack en coin-change-DP”?

Items een willekeurig aantal keer gebruiken Je oefent met Competitive Programming Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Competitive Programming Academy te beginnen?

Ervaring vooraf is niet nodig. Competitive Programming Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Onbegrensde knapsack en coin-change-DP”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Competitive Programming Academy?

Ja. Elke les over Competitive Programming Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. 0/1 knapsack: nemen of laten
  2. Knapsack met geoptimaliseerd geheugengebruik
  3. Onbegrensde knapsack en coin-change-DP
  4. Subset sum en partition
← Terug naar Competitive Programming Academy