子集sum - lisp

时间:2012-09-29 04:32:12

标签: lisp common-lisp

我试图在lisp中编写子集和问题。 示例:(subsetsum '(1 2 3) 5) = (2 3)(subsetsum '(1 5 3) 2) = nil

我只能使用功能

(atom x) 
(null x)
(eq x y)
(equal x y)
(numberp x)
(append x y)
(car x)
(cdr x)
(cons x y) 
(if x y z)
(cond ... ) 
(let ((x y) (u v)) z)
(let* ((x y) (u v)) z)
(defun ...)
(quote x) and its short form 'x
(list x1 x2 ...)
(print ...)
(sort L fun)

我可以得到任何提示吗?

1 个答案:

答案 0 :(得分:1)

此问题的简化推理如下:

  1. 您有一个列表L和一个号码S
  2. 列表的第一个元素是解决方案的一部分,或者它不是
  3. 如果第一个是解决方案的一部分,那么您需要使用它并解决更简单的问题(rest L) (- S (first L))
  4. 如果它不是解决方案的一部分,那么你需要解决更简单的问题(rest L) S
  5. 在某些情况下,您可以避免进行搜索...例如,如果列表为空且S不为零,或者所有元素都大于零,甚至将所有元素相加你无法到达S ......