Bouwsteen 3 — vul één rij in
Hier bouw je op verder
- Python If en else
Leerdoel: je schrijft de logica die voor één rij i alle cellen
OPT(i, w) invult, volgens de drie regels van vul de tabel in.
Wat we willen
Gegeven:
- de items-lijst,
- een tabel met rijen 0 t/m
i-1al ingevuld, - het rij-nummer
idat we nu willen invullen.
Vul alle cellen van rij i in, voor w = 0 t/m W (capaciteit).
De drie regels (herhaling)
Voor elke cel (i, w):
- Als
gewicht > w(item past niet):tabel[i][w] = tabel[i-1][w]. - Anders:
tabel[i][w] = max(skip, meenemen)waarbij:skip = tabel[i-1][w]meenemen = waarde + tabel[i-1][w - gewicht]
Kolom w = 0 is per definitie 0 (lege rugzak), maar als we range(W + 1)
gebruiken vult onze code dat ook netjes in via dezelfde regels.
Specificatie
- Input:
tabel,items,i(huidige rij),capaciteit. - Output: niets. De functie verandert
tabelzelf; na de aanroep is rijiingevuld.
Voorspel
We hebben rij 0 al klaar (allemaal 0). Wat moet er in rij 1 staan voor het voorbeeld van de les (item 1 = waarde 1, gewicht 1)?
Antwoord
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
w=0: item past niet (gewicht 1 > 0) → kopieertabel[0][0]= 0.w=1t/mw=11: item past. Skip =tabel[0][w]= 0. Meenemen =1 + tabel[0][w-1]= 1. → max = 1.
Klopt met de tabel van vul de tabel in.
Bouw zelf en test
Tip
Het commentaar in de starter is bijna de code. Drie dingen om op te letten:
items[i - 1]—iis het rijnummer in de tabel (vanaf 1), maar Python-lijsten tellen vanaf 0, dus-1.range(capaciteit + 1)— vergeet+1niet, anders mis je kolomw = capaciteit.meenemenkijkt in de vorige rij,gewichtkolommen naar links:tabel[i - 1][w - gewicht].
Antwoord
def vul_rij(tabel, items, i, capaciteit):
waarde, gewicht = items[i - 1]
for w in range(capaciteit + 1):
if gewicht > w:
tabel[i][w] = tabel[i - 1][w]
else:
skip = tabel[i - 1][w]
meenemen = waarde + tabel[i - 1][w - gewicht]
tabel[i][w] = max(skip, meenemen)
Regel 2 is de if, regel 3 de else. Regel 1 (rij 0) hoeft niet: die
staat al vol nullen.
Wat nu nog mist
Eén rij invullen werkt. Voor het complete algoritme herhaal je dat voor alle rijen: een extra for-lus eromheen.
Door naar vul de hele tabel →.