← до розділу

Рюкзак: динамічне програмування

Рюкзак вміщує обмежену вагу. Яку частину предметів узяти, щоб їхня сумарна цінність була найбільшою? Таблиця ДП відповідає на питання «найкраща цінність з перших i предметів при місткості w» – і будується з уже знайдених відповідей.

Таблиця ДП

поточна клітинказвідки беремоваріант, що вигравпредмет узято

Предмети й рюкзак

Зміна будь-якого повзунка будує таблицю заново.

Як рахує модель

T[0][w] = 0 – без предметів цінність нульова.
Якщо вага предмета i більша за w: T[i][w] = T[i−1][w] (предмет не влазить).
Інакше: T[i][w] = max( T[i−1][w] ; T[i−1][w − вагаi] + цінністьi ) – «не брати» або «взяти».
Відповідь – у правому нижньому куті. Відновлення: якщо T[i][w] ≠ T[i−1][w], предмет i взято, і переходимо до w − вагаi.
Клітинок (n+1)·(W+1), кожна – за сталий час: O(n·W) замість 2n перебору.

Що спробувати

Чому так?

Повний перебір перевіряє всі 2n наборів. Динамічне програмування помічає, що одні й ті самі підзадачі («найкраще з перших i предметів при місткості w») повторюються, тож кожну розв'язує один раз і записує в таблицю.

Кожна клітинка – це вибір між двома вже відомими відповідями: не брати предмет (клітинка зверху) або взяти його (клітинка зверху ліворуч на його вагу + його цінність).

Шкільна програма: інформатика, 9–11 клас (алгоритми, динамічне програмування; олімпіадна підготовка).