Сумма подмножества
Выберите из набора числа с заданной суммой. Проверить ответ — секунда, а найти его — перебор: на этой задаче видно, чем P отличается от NP.
Как решать
Задача о сумме подмножества: даны числа и цель, нужно выбрать несколько чисел с суммой, равной цели. Проверить предложенный ответ легко — сложить. А вот найти его быстрее, чем перебором, неизвестно как: у $n$ чисел $2^n$ подмножеств. Это одна из NP-полных задач — главных героев вопроса «P = NP?».
По шагам
- Упорядочьте числа по убыванию: крупные числа быстрее приближают к цели.
- Берите числа по очереди, пока сумма не превышает цель. Если зашли в тупик — уберите последнее взятое и попробуйте следующее (перебор с возвратом).
- Отсекайте безнадёжные ветки: если даже все оставшиеся числа не добирают до цели, дальше идти незачем.
- Помогает чётность и последняя цифра: например, чтобы получить нечётную сумму, нужно нечётное количество нечётных чисел.
- Проверьте ответ сложением.
Где ошибаются
- Берут одно число дважды — каждое можно использовать не больше одного раза.
- Жадно берут самые большие числа и не возвращаются, когда сумма перевалила за цель.
- Думают, что ответ единственный. Подходящих наборов может быть несколько — засчитывается любой.
- Не проверяют сумму в конце — арифметическая ошибка обидна именно здесь.