Dynamic Programming
Bottom-Up DP
Fibonacci
(defun fib1 (n)
(if (<= n 1) 1
(+ (fib1 (- n 1))
(fib1 (- n 2)))))
(defun fib (n)
(let ((f0 1) (f1 1) (f 1) (i 2))
(while (<= i n)
(setq f (+ f0 f1) f0 f1 f1 f i (+ i 1)))
f))
(fib 5) ; 8
Top-Down DP
Combinations
C(n, m) = n! / (m! (n-m)! )
C(n, m) = C(n-1, m) + C(n-1, m-1)
(defun comb (n m)
(cond
((= n m) 1)
((= m 0) 1)
((= m 1) n)
(t (+ (comb (- n 1) m)
(comb (- n 1) (- m 1))))))
(comb 3 2) ; 3
(comb 5 2) ; 10
Improved version with DP:
(defun el10 (n m)
(+ (* n 10) m)) ; 10*n+m
(setq C (make-vector 200 nil))
(defun comb1 (n m)
(let ((res 0))
(if (setq res (elt C (el10 n m))) res
(setq res
(cond
((= n m) 1)
((= m 0) 0)
((= m 1) n)
(t (+ (comb1 (- n 1) m)
(comb1 (- n 1)
(- m 1))))))
(aset C (el10 n m) res))))
(comb1 7 3) ; 35
(comb1 10 5) ; 252
Knapsack Problem
| Item | A | B | C | D | E |
| Size | 3 | 4 | 7 | 8 | 9 |
| Value | 4 | 5 | 10 | 11 | 13 |
General Solution
For every possible object Oi(sizei,
valuei) of size less or equal to the capacity of the
knapsack:
Simple Recursive Solution
(defun knapsack (S Olist)
"Simple recursive knapsack."
(if (= S 0) 0
(let ((maxval 0) (res 0) (size 0)
(val 0))
(dolist (c Olist maxval)
(setq size (car c) val (cdr c))
(cond ((>= S size)
(setq res (knapsack
(- S size) Olist))
(if (> (+ res val) maxval)
(setq maxval
(+ res val))))))))
(setq Obj-list '((3 . 4) (4 . 5) (7 . 10)
(8 . 11) (9 . 13)))
(knapsack 17 Obj-list) ; 24
Solution with DP
(setq store (make-vector 20 nil))
(defun knapsack1 (S Olist)
"Recursive knapsack with dynamic programming."
(let ((maxval 0) (res 0) (size 0) (val 0))
(cond ((setq res (elt store S)) res)
((= S 0) 0)
(t
(dolist (c Olist maxval)
(setq size (car c) val (cdr c))
(cond ((>= S size)
(setq res (knapsack1
(- S size) Olist))
(if (> (+ res val) maxval)
(setq maxval (+ res
val))))))
(aset store S maxval)))))
(knapsack1 17 Obj-list); 24