不过你这功能,哪儿用的到? 这个感觉像"百钱买百鸡"问题,应该遍历所有组合,找到最接近的值。 edata 发表于 2015-8-30 08:48 static/image/common/back.gif
这个感觉像"百钱买百鸡"问题,应该遍历所有组合,找到最接近的值。
列出所有组合怎么写呢.. how about this?:
先将表b1从大到小排序,(setq b2 (reverse b1))
取b1 第1个元素 和b2第1个元素,加入到b3。取b1 第3个元素 和b2第3个元素,加入到b3。。。
取b1 第2个元素 和b2第2个元素,加入到b4。取b1 第4个元素 和b2第4个元素,加入到b4。。。
取到表的一半左右为止。
b3b4 即为所得。 fl202 发表于 2015-8-31 09:11 static/image/common/back.gif
how about this?:
先将表b1从大到小排序,(setq b2 (reverse b1))
取b1 第1个元素 和b2第1个元素,加入到 ...
这样得到的是项数要差不多,要是b1是‘(20 8 6 6)怎么办? 那就要再加判断了:判断b3内元素的总和与b4内元素的总和的差值,如果差值较大,
把b3最后一项给b4,然后比较两个表总和的差值,差值变小了,再把b3 最后一项给b4。如果差值变大,那现在的b3b4就是最终结果了。
表的元素多了,很难有最优解,除非你的表有规律。 本帖最后由 mahuan1279 于 2019-11-12 17:50 编辑
(defun fen_2 (lst k)
(setq sum (apply '+ lst))
(setq p1 (- (/ sum 2) k))
(setq p2 (+ (/ sum 2) k))
(setq lst (mapcar 'cadr(vl-sort (mapcar '(lambda (x) (cons (* x 1.0) (list x))) lst) '(lambda (ea eb) (>= (car ea) (car eb))))))
(setq lst1 (mapcar '(lambda (x y)
(progn
(list (if (> (+ x y) p1) x (+ x y))
y
(if(> (+ x y) p1)
(list x)
(listx y)
)
)
)
)
(reverse (cdr (reverse lst)))
(cdr lst)
)
)
(setq lst2 (mapcar '(lambda (x y)
(progn
(list (if (> (+ x y) p2) x (+ x y))
y
(if(> (+ x y) p2)
(list x)
(listx y)
)
)
)
)
(reverse (cdr (reverse lst)))
(cdr lst)
)
)
(while (cdr lst1)
(setq lst1 (mapcar '(lambda (x y)
(if (> (+ (car x) (cadr y)) p1)
(if (>= (car x)(car y))
x
y
)
(if (>= (+ (car x) (cadr y)) (car y))
(list
(+ (car x) (cadr y))
(cadr y)
(cons (cadr y) (last x))
)
y
)
)
)
(reverse (cdr (reverse lst1)))
(cdr lst1)
)
)
)
(while (cdr lst2)
(setq lst2 (mapcar '(lambda (x y)
(if (> (+ (car x) (cadr y)) p2)
(if (>= (car x)(car y))
x
y
)
(if (>= (+ (car x) (cadr y)) (car y))
(list
(+ (car x) (cadr y))
(cadr y)
(cons (cadr y) (last x))
)
y
)
)
)
(reverse (cdr (reverse lst2)))
(cdr lst2)
)
)
)
(if (<= (- sum (* 2 (cadr (car lst1))))
(- (* 2 (cadr (car lst2))) sum)
)
(setq va (cons sum (cons (car (car lst1)) (cdr (cdr (car lst1))))))
(setq va (cons sum (cons (car (car lst2)) (cdr (cdr (car lst2))))))
)
va
)
_$ (FEN_2 '(5.12 3.62 3.02 3.92 3.32 3.12) 0)
(22.12 10.86 (3.32 3.92 3.62))
_$ (FEN_2 '(6.32 5.12 3.62 3.02 3.92 3.32 3.12) 0)
(28.44 13.98 (3.12 3.32 3.92 3.62))
_$ (FEN_2 '(7.58 6.32 5.12 3.62 3.02 3.92 3.32 3.12) 0)
(36.02 17.82 (3.92 7.58 6.32))
_$ (FEN_2 '(29 7.58 6.32 5.12 3.62 3.02 3.92 3.32 3.12) 0)
(65.02 32.32 (3.32 29))
_$ (fen_2 '(5 5 4 4 3) 0)
(21 10 (5 5))
_$
页:
1
[2]