(require-library "trace.ss") (define (powerset s) (if (null? s) (list s) (let ((psc (powerset (cdr s)))) (append psc (map (lambda (el) (cons (car s) el)) psc))))) (define (sumlist lst) (if (null? lst) 0 (+ (car lst) (sumlist (cdr lst))))) (define (knapsack lst max) (find-best-knapsack (powerset lst) max)) (define (find-best-knapsack pset max) (if (null? pset) pset ; a bit dangerous, but we know the empty knapsack is less than max (let ((best (find-best-knapsack (cdr pset) max)) (tsum (sumlist (car pset)))) (if (> tsum max) best (if (> tsum (sumlist best)) (car pset) best)))))