NP-полнота задачи о сумме подмножества
Задача: |
Дано множество | , содержащие целых чисел и целое число . Требуется выяснить, возможно ли выбрать подмножество с суммой :
Содержание
Доказательство NP-полноты
Для доказательства того, что задаче о сумме подмножества (англ. Subset sum problem, NP-полной, необходимо доказать два факта:
)Доказательство принадлежности NP
В качестве сертификата возьмем удовлетворяющее условию задачи множество
с суммой . Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов в множество за время .Доказательство принадлежности NPH
Сведем к задаче о сумме подмножества. Пусть задана 3-CNF формула от переменных , состоящая из пар скобок . Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию .
Построение сводящей функции
Для каждой переменной
и каждой пары скобок создадим по два числа в десятичной системе счисления, каждое длиной цифр. Эти числа образуют . Также создадим число длиной цифр. Присвоим каждому разряду полученных чисел (одинаковую для всех чисел) метку, соответствующую либо переменной, либо паре скобок. Метки, соответствующие парам скобок, присвоены младшим разрядам чисел.- В числе все разряды, соответствующие переменным, установим , а оставшиеся сделаем равными .
- Каждой переменной соответствуют два числа из : и . Опишем создание этих чисел. Разряд, соответствующий установим равным , а все остальные разряды, соответствующие переменным, установим равными . Далее, для числа установим все разряды, соответствующие парам скобок, содержащих , равными . Во все остальные "скобочные" разряды поставим . В числе установим все разряды, соответствующие парам скобок, содержащих , равными , а во все остальные "скобочные" разряды поставим .
- Каждой паре скобок соответствуют два числа из : и . Оба этих числа содержат во всех разрядах, кроме соответствующего . В этом разряде у поставим , а у — .
Корректность сводящей функции
- Получаемое сводящей функцией множество состоит из десятичных чисел длиной каждое, выставление каждого разряда занимает полиномиальное время. Таким образом, сведение выполняется за полиномиальное время.
- Пусть формула выполнима, то есть существует набор значений . И пусть . Тогда в полученном множестве существует подмножество с суммой . Действительно, для каждой переменной, если , то добавим в . Иначе добавим . Теперь содержит уже чисел. Заметим, что для каждого "скобочного" разряда в уже набранной части есть не менее одного и не более трех чисел, у которых в данном разряде стоит . Значит для каждого соответствующего паре скобок разряда мы сможем выбрать одно или оба числа и так, чтобы сумма в данном разряде совпадала с требуемой (стала равна ). Добавим их в . Также заметим, что суммы во всех "переменных" разрядах равны , так как для каждого выбиралось строго одно число из и . Значит, .
- Пусть теперь в наборе есть подмножество . Тогда исходная формула выполнима. Действительно, если , то установим переменную . Если же , то . Покажем, что . Действительно, так как , в каждой паре скобок хотя бы один терм равен . Значит каждый терм равен . А тогда и вся .
Пример сведения
Пусть исходная функция
. Пометим разряды следующим образом (слева направо): . Тогда:
Тогда набору значений
соответствует . И действительно, .См. также
Источники информации
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" — Издательство MIT Press, 2009. — 1086 c. — ISBN 978-0-262-03384-8 (англ.)
- Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. — М.: Издательский дом "Вильямс", 2002. — 423 с. — ISBN 5-8459-0261-4 (рус.)