Рюкзак 0/1
Что взять в рюкзак при лимите веса: каждая вещь либо в рюкзаке, либо нет.
1function knapsack(items: Array<[w: number, v: number]>, cap: number): number {2 const n = items.length3 // d[i][c] — максимум ценности из первых i предметов при вместимости c4 const d: number[][] = Array.from({ length: n + 1 }, () =>5 new Array(cap + 1).fill(0),6 )7 8 for (let i = 1; i <= n; i++) {9 const [w, v] = items[i - 1]!10 for (let c = 0; c <= cap; c++) {11 d[i][c] = d[i - 1][c] // не берём предмет i12 if (w <= c && d[i - 1][c - w] + v > d[i][c]) {13 d[i][c] = d[i - 1][c - w] + v // берём14 }15 }16 }17 18 return d[n][cap]19}Проблема
Что взять в рюкзак при лимите веса: каждая вещь либо в рюкзаке, либо нет.
Что вы видите
Таблица: строки — предметы, столбцы — вместимость; клетка — максимум ценности.
Как это работает
d[i][c] = max(без предмета i, с предметом i при весе ≤ c). Обратный ход восстанавливает список. Фундамент распределения ресурсов: бюджеты, грузы, портфели.
Пошаговый разбор
- 01
Не берём
Наследуем строку выше.
- 02
Берём
d[i−1][c−w] + ценность.
- 03
Ответ
Правый нижний угол.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Инвестпортфели
Выбор проектов под бюджет с максимальной отдачей.
Грузоперевозки
Загрузка транспорта по весу и ценности.
Мощности
Задачи на серверы под лимит ресурсов.
Связанные алгоритмы
«Бюджет, грузы, портфель: всё это рюкзак»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.