My first Magazine pemrograman-kompetitif-dasar | Page 75

7.1 Konsep Dynamic Programming Algoritma 28 Penyelesaian Coin Change secara top-down . 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: function SOLVE (x) if (x = 0) then return 0 end if if computed[x] then return memo[x] end if best ← ∞ for k ← 1, M do if (a k ≤ x) then best ← min(best, SOLVE (x − a k ) + 1) end if end for computed[x] ← true memo[x] ← best return best end function . Sudah pernah dihitung, langsung kembalikan . Tandai bahwa sudah pernah dihitung . Simpan hasil perhitungan Algoritma 28 merupakan implementasi penyelesaian Coin Change dengan memoisasi. Asum- sikan untuk menghitung suatu nilai f (x), kita membutuhkan O(M) iterasi. Maka, untuk menghitung nilai f (x) untuk seluruh x, kita membutuhkan O(NM) operasi. Banyaknya operasi ini polinomial terhadap N dan M, dan jauh lebih cepat daripada solusi rekursif sebelumnya. Analisis Top-down Top-down merupakan transformasi alami dari rumus rekursif, sehingga biasanya mudah diimplementasikan. Urutan pengisian tabel tidak penting dan hanya menghitung nilai dari fungsi jika hanya diperlukan. Ketika seluruh tabel memo pada akhirnya terisi, bisa saja lebih lambat karena adanya overhead pemanggilan fungsi. 7.1.2 Bottom-up Pada bottom-up , penyelesaian masalah dimulai dari kasus yang kecil. Ketika merumuskan rumus rekursif, kita mengetahui jawaban kasus yang paling kecil, yaitu base case . Informasi ini digunakan untuk menyelesaikan kasus yang lebih besar. Bottom-up biasanya dianalogikan dengan pengisian "tabel DP". Berbeda dengan top-down , bottom-up ini dilakukan secara iteratif. Kali ini kita akan mencoba menyelesaikan Coin Change secara bottom-up . Pada bottom-up , kita hitung semua nilai f (x) untuk semua nilai x dari 0 sampai N secara menaik. Nilai dari f (x) disimpan dalam array f [x]. 65