My first Magazine pemrograman-kompetitif-dasar | Page 73

7.1 Konsep Dynamic Programming solusi kasus yang lebih kecil belum ada, maka kita akan mencarinya terlebih dahulu, lalu mencatat hasilnya. Hal ini dilakukan secara rekursif. Pada soal Coin Change , anggaplah kita membayar N rupiah dengan koin-koin satu per satu. Pastilah terdapat koin pertama yang kita bayarkan. Jika nilai koin itu adalah a k , maka sisa uang yang perlu kita bayar adalah N − a k . Dalam kasus ini, terdapat M pilihan koin untuk a k . Perhatikan bahwa penukaran N − a k merupakan suatu subpersoalan yang serupa dengan persoalan awalnya. Artinya, cara yang sama untuk menyelesaikan subpersoalan dapat digunakan sehingga strategi penyelesaian secara rekursif dapat digunakan. Solusi Rekursif Definisikan sebuah fungsi f (x) sebagai banyaknya koin minimum yang dibutuhkan untuk membayar tepat x rupiah. Kita dapat mencoba-coba satu koin yang ingin kita gunakan. Jika suatu koin a k digunakan, maka kita membutuhkan f (x − a k ) koin ditambah satu koin a k , atau dapat ditulis f (x) = f (x − a k ) + 1. Pencarian nilai f (x − a k ) dilakukan secara rekursif, kita kembali mencoba-coba koin yang ingin digunakan. Pilihan yang terbaik akan memberikan nilai f (x − a k ) + 1 sekecil mungkin, sehingga kita cukup mencoba semua kemungkinan a k , dan ambil yang hasil f (x − a k ) + 1 terkecil. Dalam solusi rekursif, kita harus menentukan base case dari f (x). Kasus terkecilnya adalah f (0), yang artinya kita hendak membayar 0 rupiah. Membayar 0 rupiah tidak membutuhkan satu pun koin, sehingga f (0) = 0. Secara matematis, hubungan rekursif ini dituliskan:  x = 0  0, f (x) = min f (x − a k ) + 1, x > 0  1≤k≤M a k ≤x Kita implementasikan f (x) sebagai fungsi SOLVE (x) pada Algoritma 27. Algoritma 27 Penyelesaian Coin Change secara rekursi. function SOLVE (x) 2: if (x = 0) then 3: return 0 4: end if 1: 5: 6: 7: 8: 9: 10: 11: 12: best ← ∞ for k ← 1, M do if (a k ≤ x) then best ← min(best, SOLVE (x − a k ) + 1) end if end for return best end function 63