60 lines
1.5 KiB
Scheme
60 lines
1.5 KiB
Scheme
; PROBLEW
|
|
; W - maximum bag weight
|
|
; {m_1, m_2, ... m_n} = item weights
|
|
; {v_1, v_2, ... v_n} = item values
|
|
|
|
; want to choose a subset I so that
|
|
; sum m_i <= W
|
|
; and
|
|
; sum v_i is maximized
|
|
; In other words, if we choose another subset J
|
|
; then sum v_j <= sum v_i
|
|
|
|
|
|
(define (rand-item max-weight max-cost)
|
|
(cons (random max-weight)
|
|
(random max-cost)))
|
|
|
|
(define (build-items n)
|
|
(if (= n 0)
|
|
'()
|
|
(cons (rand-item 100 100)
|
|
(build-items (- n 1)))))
|
|
;(random-seed! (GET-UNIVERSAL-TIME))
|
|
;(define items (build-items 10))
|
|
|
|
|
|
(define items '((23 . 505) (26 . 352) (18 . 220) (32 . 354) (27 . 414) (29 . 498) (26 . 545) (30 . 473) (27 . 543)))
|
|
|
|
(define (knapsack remaining items)
|
|
(if (or (null? items) (<= remaining 0))
|
|
0
|
|
(let ((weight (car (car items)))
|
|
(val (cdr (car items))))
|
|
(max
|
|
(if (>= (- remaining weight) 0)
|
|
(+ val (knapsack (- remaining weight) (cdr items)))
|
|
0)
|
|
(knapsack remaining (cdr items))))))
|
|
|
|
(display (knapsack 67 items))
|
|
|
|
(assert (= (knapsack 67 items) 1270))
|
|
|
|
|
|
; https://en.wikipedia.org/wiki/Levenshtein_distance
|
|
(define (edit-distance-list a b eq?)
|
|
(cond ((null? a) (length b))
|
|
((null? b) (length a))
|
|
(else (min
|
|
(+ 1 (edit-distance-list (cdr a) b eq?)) ; insert
|
|
(+ 1 (edit-distance-list a (cdr b) eq?)) ; delete
|
|
(+
|
|
(if (eq? (car a) (car b)) 0 1) ; replace if needed
|
|
(edit-distance-list (cdr a) (cdr b) eq?))))))
|
|
|
|
(define (edit-distance a b)
|
|
(edit-distance-list (string->list a) (string->list b) char=?))
|
|
|
|
(==> (edit-distance "kitten" "sitting") 3)
|