Защитный экран робота: точная мощность

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

Условие

На складе школьной робототехники есть робот-охранник. Перед проходом через рамку безопасности он должен включить защитный экран ровно нужной мощности, иначе рамка его не пропустит.

У робота есть k защитных пластин. Каждую пластину можно поставить не более одного раза, и тогда она добавляет к мощности экрана своё число единиц.

Нужно понять, можно ли набрать мощность ровно T. Если можно — выбрать «самый аккуратный» набор: 1) с минимальным количеством пластин; 2) если таких наборов несколько — с лексикографически минимальным списком индексов пластин (индексы считаются с 1, список сравнивается как обычно: сначала первые элементы, затем вторые и т.д.).

Формат ввода

В первой строке два целых числа k и T. Во второй строке k целых чисел a1, a2, ..., ak — мощности пластин.

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

Если набрать ровно T нельзя, выведите одну строку NO.

Иначе выведите:

Ограничения

Пример

Ввод:

5 10
2 3 7 8 1

Вывод:

YES
2
1 4

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

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

Ключевое наблюдение: k ≤ 7, значит всех вариантов установки пластин всего 2^k (максимум 128). Это настолько мало, что можно честно проверить каждый набор и выбрать «самый аккуратный» по правилам.

Приём: перебор подмножеств битмаской. Число mask от 0 до 2^k - 1 кодирует, какие пластины взяли: i-я пластина взята, если mask имеет i-й бит.

План решения:

Сложность: O(k * 2^k), здесь это максимум 7 * 128 операций — мгновенно.

Частая ошибка: забыть про случай T = 0. Тогда подходит пустой набор (m = 0), и третья строка должна быть пустой, но её всё равно нужно вывести.

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

Есть 5 пластин с мощностями 2, 3, 7, 8, 1. Нужно набрать ровно 10, используя каждую пластину не больше одного раза. Если вариантов несколько — берём с меньшим числом пластин, а если поровну — с более «ранними» индексами.

Идея: Перебери все возможные наборы пластин (каждую можно либо взять, либо не взять), для каждого посчитай сумму. Среди тех, где сумма ровно нужная, выбери набор с минимальным числом пластин, а если таких несколько — тот, у которого список индексов получается «раньше» при обычном сравнении слева направо.

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

Куда дальше