伪书虫86 发表于 2015-8-29 19:52:14

最优解貌似只有穷举。。。
不过你这功能,哪儿用的到?

edata 发表于 2015-8-30 08:48:26

这个感觉像"百钱买百鸡"问题,应该遍历所有组合,找到最接近的值。

王与韩1 发表于 2015-8-30 11:55:39

edata 发表于 2015-8-30 08:48 static/image/common/back.gif
这个感觉像"百钱买百鸡"问题,应该遍历所有组合,找到最接近的值。

列出所有组合怎么写呢..

fl202 发表于 2015-8-31 09:11:28

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 即为所得。

王与韩1 发表于 2015-8-31 09:29:41

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)怎么办?

fl202 发表于 2015-8-31 16:30:30

那就要再加判断了:判断b3内元素的总和与b4内元素的总和的差值,如果差值较大,
把b3最后一项给b4,然后比较两个表总和的差值,差值变小了,再把b3 最后一项给b4。如果差值变大,那现在的b3b4就是最终结果了。

表的元素多了,很难有最优解,除非你的表有规律。

mahuan1279 发表于 2019-11-12 17:39:18

本帖最后由 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]
查看完整版本: 请教各位数字按和分成两组的问题