2.2. Аппроксимация с заданной точностью 99
значаем стоимость оптимального набора). Это аналогично за-
полнению за n шагов 0/1 таблицы размером B×f
∗
, представля-
ющей пространство всевозможных допустимых (не обязатель-
но оптимальных) решений задачи 13 «Knapsack».
Однако уменьшить перебор можно учитывая следующий
ключевой факт: Если на k-м шаге у нас имеется несколько ча-
стичных решений с одинаковой массой, но различной стоимо-
стью, то можно для каждой массы оставить решения лишь
с максимальной стоимостью, а если есть несколько частич-
ных решений с одинаковой стоимостью, но различной массой,
то можно смело выкинуть решения с большей массой. При
любом из упомянутых действий мы не потеряем оптимальное
решение!
Соответственно, это означает отсутствие необходимости
держать в памяти все частичные решения, достаточно на каж-
дой итерации помнить не больше, чем B наиболее «дорогих»
частичных решений, либо не больше, чем f
∗
наиболее «легких»
решений.
Алгоритм 24 «Рюкзак-ДинПрог» помнит о наиболее «доро-
гих» частичных допустимых решениях и тем самым дает точ-
ное решение задачи за время O(nB).
Действительно,
1) число циклов равно n;
2) размер множества отобранных частичных решений не
превосходит B.
Упражнение 2.2.2. Постройте алгоритм динамического про-
граммирования для задачи 13 «Knapsack», основанный на от-
боре наиболее «легких» частичных решений. Какова будет его
временная сложность?
Таким образом, для небольших значений параметров
c
1
, . . . , c
n
или B можно построить эффективный псевдополи-
номиальный алгоритм для точного решения задачи о рюкзаке.