Задача о рюкзаке - Lisp

Узнай цену своей работы

Формулировка задачи:

Алгоритм решает задачу о рюкзаке, которая формулируется так: дан, упорядоченный по убыванию, массив A целых положительных чисел и некоторые Sum, необходимо найти подпоследовательности массива A, сумма элементов которых равна в точности Sum.

Решение задачи: «Задача о рюкзаке»

textual
Листинг программы
(defun knapstack (w n &optional acc ac
                  &aux (a (car w)) (d (cdr w)) (b (cons a ac)))
  (if w 
      (let ((z (apply #'+ b)))
        (knapstack d
                   n
                   (if (= z n)
                       (adjoin (reverse b) acc :test #'equal)
                       (knapstack d n acc ac))
                   (if (< z n) b ac)))
      acc))
 
> (knapstack '(9 8 7 6 5 4 3 2 1) 13)
((9 3 1) (9 4) (8 4 1) (8 3 2) (8 5) (7 5 1) (7 4 2) (7 3 2 1) (7 6) (6 5 2) 
 (6 4 2 1) (6 4 3) (5 4 3 1))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5