My first Magazine pemrograman-kompetitif-dasar | Page 79
7.2 Contoh-contoh DP Sederhana
Jika tersedia 5 buah barang sebagai berikut:
Nomor Barang
1
2
3
4
5
Harga
6
5
4
6
4
Berat
5
4
3
7
4
Jika kita memiliki kapasitas sebesar 14, solusi terbaik adalah mengambil barang ke 1, 2,
dan 5. Total harga yang diperoleh adalah 6 + 5 + 4 = 15.
Perhatikan bahwa untuk setiap barang, terdapat dua pilihan yang dapat kita lakukan: ambil
atau tinggalkan. Jika barang tersebut diambil, kapasitas tas kita berkurang dan harga barang yang
kita dapatkan bertambah. Jika barang tersebut tidak diambil, tidak terjadi perubahan. Dengan
demikian, kita bisa memformulasikan sebuah fungsi d p(i, c) sebagai jumlah harga maksimum
yang mungkin diperoleh, jika kita hanya mempunyai barang ke-1 sampai ke-i dan sisa kapasitas
tas kita adalah c gram. Untuk menghitung fungsi d p(i, c), kita akan mencoba apakah kita akan
memasukkan barang ke-i ke tas atau tidak.
Jika i = 0, maka berarti tidak ada barang yang tersedia. Ini berarti d p(i, c) = 0. Kasus ini
menjadi base case . Selain kasus base case , untuk setiap i dan c, kita memiliki paling banyak dua
pilihan:
• Kasus 1: Mengambil barang ke-i
Jika kita memasukkan barang ke-i ke tas, maka kita akan menyisakan barang ke-1 sampai
ke-(i − 1) dan sisa kapasitas tas menjadi c − w i . Harga barang yang didapatkan pada kasus
ini adalah d p(i − 1, c − w i ) ditambah dengan harga yang kita peroleh pada barang ke-i, atau
dapat dituliskan d p(i, c) = d p(i − 1, c − w i ) + v i . Karena kita memiliki kapasitas tas c, kasus
ini hanya boleh dipertimbangkan jika c ≥ w i .
• Kasus 2: Tidak mengambil barang ke-i
Jika kita tidak memasukkan barang ke-i ke tas, maka kita akan menyisakan barang ke-1
sampai ke-(i − 1) dan sisa kapasitas tas masih tetap c. Harga barang didapatkan pada
kasus ini adalah d p(i − 1, c), tanpa tambahan apapun (kita tidak mengambil barang ke-i),
atau dapat dituliskan d p(i, c) = d p(i − 1, c).
Dari kedua pilihan keputusan tersebut, kita tertarik dengan pilihan yang menghasilkan nilai
terbesar. Dengan demikian d p(i, c) dapat dirumuskan sebagai berikut:
i = 0
0,
d p(i − 1, c),
i > 0 ∧ c < w i
d p(i, c) =
max(d p(i − 1, c − w i ) + v i , d p(i − 1, c)), i > 0 ∧ c ≥ w i
Analisis Kompleksitas
Terdapat O(N) nilai berbeda untuk nilai i dan O(G) nilai berbeda untuk nilai c pada d p(i, c).
Dibutuhkan O(1) untuk menghitung d p(i, c). Sehingga untuk menghitung seluruh nilai d p(i, c)
untuk seluruh i dan c dibutuhkan waktu O(NG).
69