RosettaCodeData/Task/Knapsack-problem-Bounded/PicoLisp/knapsack-problem-bounded.l

33 lines
1.2 KiB
Text
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
(de *Items
("map" 9 150 1) ("compass" 13 35 1)
("water" 153 200 3) ("sandwich" 50 60 2)
("glucose" 15 60 2) ("tin" 68 45 3)
("banana" 27 60 3) ("apple" 39 40 3)
("cheese" 23 30 1) ("beer" 52 10 3)
("suntan cream" 11 70 1) ("camera" 32 30 1)
("t-shirt" 24 15 2) ("trousers" 48 10 2)
("umbrella" 73 40 1) ("waterproof trousers" 42 70 1)
("waterproof overclothes" 43 75 1) ("note-case" 22 80 1)
("sunglasses" 7 20 1) ("towel" 18 12 2)
("socks" 4 50 1) ("book" 30 10 2) )
# Dynamic programming solution
(de knapsack (Lst W)
(when Lst
2014-04-02 16:56:35 +00:00
(cache '*KnapCache (cons W Lst)
2013-04-10 21:29:02 -07:00
(let X (knapsack (cdr Lst) W)
(if (ge0 (- W (cadar Lst)))
(let Y (cons (car Lst) (knapsack (cdr Lst) @))
(if (> (sum caddr X) (sum caddr Y)) X Y) )
X ) ) ) ) )
(let K
(knapsack
(mapcan # Expand multiple items
'((X) (need (cadddr X) NIL X))
*Items )
400 )
(for I K
(apply tab I (3 -24 6 6) NIL) )
(tab (27 6 6) NIL (sum cadr K) (sum caddr K)) )