My first Magazine pemrograman-kompetitif-dasar | Page 80
7 Dynamic Programming
Solusi Top-Down
Kita implementasikan d p(i, c) sebagai fungsi SOLVE (i, c) pada Algoritma 30.
Algoritma 30 Knapsack secara top-down .
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function SOLVE (i, c)
if (i = 0) then
return 0
end if
if computed[i][c] then
return memo[i][c]
end if
best ← SOLVE (i − 1, c)
if (c ≥ w[i]) then
best ← max(best, SOLVE (i − 1, c − w[i]) + v[i])
end if
computed[i][c] ← true
memo[i][c] ← best
return best
end function
Jawaban akhirnya ada pada SOLVE (N, G).
Solusi Bottom-Up
Pengisian tabel DP secara bottom-up dapat dilihat pada Algoritma 31.
Algoritma 31 Knapsack secara bottom-up .
function SOLVE ()
2:
for c ← 0, G do
3:
d p[0][c] ← 0
4:
end for
1:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
. Base case
for i ← 1, N do
. Isi "tabel" dari kasus yang kecil ke besar
for c ← 0, G do
best ← d p[i − 1][c]
if (c ≥ w[i]) then
best ← max(best, d p[i − 1][c − w[i]] + v[i])
end if
d p[i][c] ← best
end for
end for
return d p[N][G]
end function
Optimisasi Memori pada Bottom-Up
Terdapat sifat khusus pada perhitungan DP Knapsack secara bottom-up . Perhatikan
bahwa untuk menghitung nilai d p(i, _), hanya dibutuhkan informasi d p(i − 1, _). Informasi d p(0, _),
70