Competitive Programming Academy · leksjon

Plassoptimalisert ryggsekk

Reduser to dimensjoner til én rad

Leksjon 2 av 413 trinn

Plassoptimalisert ryggsekk er en gratis leksjon i Competitive Programming Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Competitive Programming Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Competitive Programming Academy inneholder totalt 4 leksjoner.

Hvorfor optimalisere plassbruken

En full tabell bruker n ganger cap minne, noe som kan bli enormt for store inndata. Plassoptimalisering reduserer dette til én rad som du gjenbruker.

Bare den siste raden er viktig

Legg merke til at hver celle bare leser den forrige raden, aldri noe eldre. Derfor trenger du ikke å lagre hele rutenettet samtidig.

Reduser til ett array

Behold ett dp-array med lengde cap+1. Når du behandler hver gjenstand, overskriver du arrayet på stedet slik at det representerer den nye raden.

dp = [0] * (cap + 1)

Fellen ved gjenbruk

Hvis du går gjennom kapasiteten fra venstre mot høyre, kan dp[w - wt[i]] allerede være oppdatert for denne samme gjenstanden. Da ville du kunne ta gjenstand i to ganger.

Gå gjennom kapasiteten baklengs

Løsningen er å gå gjennom kapasiteten fra høy til lav. Når du går baklengs, er du garantert at dp[w - wt[i]] fortsatt inneholder verdien fra forrige rad.

for w in range(cap, wt[i] - 1, -1):
    dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

Hvorfor baklengs fungerer

Når du beregner dp[w], er den mindre indeksen w - wt[i] fortsatt urørt i denne runden, så den gjenspeiler raden over slik den skal.

Stopp tidlig ved vekten

Kapasiteter under wt[i] kan ikke romme gjenstanden, så løkken stopper ved wt[i]. Ved å hoppe over dem sparer du noen ufarlige gjennomløp.

Hele løkken

Hele løsningen består av to nøstede løkker over ett array. Gjenstandene ytterst, kapasiteten baklengs innerst, og svaret kommer av seg selv.

for i in range(n):
    for w in range(cap, wt[i] - 1, -1):
        dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

Les av den siste cellen

Etter alle gjenstandene inneholder dp[cap] maksimumsverdien. Det er det samme tallet som 2D-tabellen ville gitt, men med langt mindre minnebruk.

Samme tid, mindre minne

Du gjorde ikke algoritmen raskere; den bruker fortsatt arbeid på størrelsesorden n ganger cap. Du reduserte bare minnebruken fra kvadratisk til lineær.

Når det lønner seg

Dette trikset redder deg når cap er stor og 2D-rutenettet ville overskredet minnegrensen. Det er en klassiker i konkurranser som er verdt å huske.

Rask sjekk

Test den viktigste regelen for 1D-ryggsekkproblemet.

Oppsummering

Du reduserte 2D-tabellen til ett array og gikk gjennom kapasiteten baklengs for å holde løsningen korrekt. Dermed byttet du kvadratisk minnebruk mot lineær. 🚀

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Plassoptimalisert ryggsekk» gratis?

Ja – hele teksten i «Plassoptimalisert ryggsekk» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Competitive Programming Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Competitive Programming Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Plassoptimalisert ryggsekk»?

Reduser to dimensjoner til én rad Du øver på Competitive Programming Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Competitive Programming Academy?

Ingen tidligere erfaring er nødvendig. Competitive Programming Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Plassoptimalisert ryggsekk»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Competitive Programming Academy-leksjonen?

Ja. Alle Competitive Programming Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. 0/1-ryggsekk: ta eller la være
  2. Plassoptimalisert ryggsekk
  3. Ubegrenset ryggsekk og myntvekslings-DP
  4. Delsum og partisjonering
← Tilbake til Competitive Programming Academy