Лут с ограничением по весу

тема: Перебор подмножеств (bitmask) · уровень: базовый

Условие

В игре ты идёшь в рейд с маленьким рюкзаком. На земле лежат предметы: у каждого есть вес и ценность. Рюкзак выдержит не больше заданного веса.

Твоя цель — унести набор предметов так, чтобы суммарная ценность была максимальной, а суммарный вес не превышал ограничение.

Важно: ответ может не помещаться в 32-битный тип (как на олимпиадах). В Python это не проблема.

Формат ввода

В первой строке даны два целых числа n и C — количество предметов и максимальный допустимый вес рюкзака.

В следующих n строках записаны пары целых чисел w_i и v_i — вес и ценность i-го предмета.

Формат вывода

Выведите одно целое число — максимальную суммарную ценность, которую можно унести.

Ограничения

Пример

Ввод

4 7
3 10
4 11
5 13
2 5

Вывод

21

(Можно взять предметы с весами 3 и 4: общий вес 7, ценность 21.)

Как решать — идея подхода

Приём: Перебор подмножеств битмаской

Ключевое наблюдение: предметов очень мало (n ≤ 18), значит количество всех наборов равно 2^n, это всего до 262144. Такой перебор проходит быстро, и не нужен «тяжёлый» динамический рюкзак.

Приём: битмаска. Число mask от 0 до 2^n - 1 кодирует подмножество: i-й бит равен 1, если предмет i взят. Для каждого mask считаем суммарный вес и ценность, и обновляем ответ, если вес не превышает C.

План:

Сложность: O(n * 2^n), здесь это примерно 18 * 262144 операций — нормально.

Частая ошибка: забыть про раннее отсечение и/или неправильно обработать «прерывание» — важно не обновлять ответ для маски, которая уже превысила C.

Разберись руками

Есть 4 предмета: (вес 3, ценность 10), (4, 11), (5, 13), (2, 5). Рюкзак выдержит максимум 7 по весу. Нужно выбрать такой набор предметов, чтобы вес не превысил 7, а ценность была как можно больше.

Идея: Когда предметов мало, можно перебрать все возможные наборы. Для каждого набора руками считаем суммарный вес и суммарную ценность, выкидываем те, что тяжелее ограничения, а среди оставшихся выбираем самый большой результат по ценности.

Решить задачу с автопроверкой на Python →

Куда дальше