Математика EN

Тренажёры · Глава 60

Сумма подмножества

Выберите из набора числа с заданной суммой. Проверить ответ — секунда, а найти его — перебор: на этой задаче видно, чем P отличается от NP.

Как решать

Задача о сумме подмножества: даны числа и цель, нужно выбрать несколько чисел с суммой, равной цели. Проверить предложенный ответ легко — сложить. А вот найти его быстрее, чем перебором, неизвестно как: у $n$ чисел $2^n$ подмножеств. Это одна из NP-полных задач — главных героев вопроса «P = NP?».

По шагам

  1. Упорядочьте числа по убыванию: крупные числа быстрее приближают к цели.
  2. Берите числа по очереди, пока сумма не превышает цель. Если зашли в тупик — уберите последнее взятое и попробуйте следующее (перебор с возвратом).
  3. Отсекайте безнадёжные ветки: если даже все оставшиеся числа не добирают до цели, дальше идти незачем.
  4. Помогает чётность и последняя цифра: например, чтобы получить нечётную сумму, нужно нечётное количество нечётных чисел.
  5. Проверьте ответ сложением.
Сколько чисел в наборе: каждое либо берём, либо нет. Пример: из $\{29, 31, 17, 33, 12\}$ сумма $48$: $31 + 17 = 48$. Проверка — одно сложение, а вариантов было $2^5 = 32$.

Где ошибаются

  • Берут одно число дважды — каждое можно использовать не больше одного раза.
  • Жадно берут самые большие числа и не возвращаются, когда сумма перевалила за цель.
  • Думают, что ответ единственный. Подходящих наборов может быть несколько — засчитывается любой.
  • Не проверяют сумму в конце — арифметическая ошибка обидна именно здесь.

Пример

Главы курса