仍然使用首次拟合递减算法,一些稍微短的代码,但是比gile的变体慢:
- (defun binpack ( l s / a b c x )
- (foreach x (vl-sort-i l '>)
- (setq c nil
- x (nth x l)
- a (vl-member-if '(lambda ( b ) (cond ((
- b (append (reverse c) (cons (cons x (car a)) (cdr a)))
- )
- )
- )
- (setq l '(80 26 57 18 8 45 16 22 29 5 11 8 27 54 13 17 21 63 14 16 45 6 32 57 24 18 27 54 35 12 43 36 72 14 28 3 11 46 27 42 59 26 41 15 41 68)
- s 80
- )
- _$ (binpack l s)
- ((80) (8 72) (12 68) (17 63) (21 59) (22 57) (5 18 57) (26 54) (26 54) (32 46) (35 45) (6 29 45) (36 43) (8 28 42) (11 27 41) (11 27 41) (3 18 24 27) (14 14 15 16 16) (13))
- _$ (length (binpack l s))
- 19
gile,如果用整数测试,要小心
vl-sort |