Сумма подмножества: уменьшите специальный к общему случаю

20

Википедия формулирует проблему суммы подмножеств как поиск подмножества данного мультимножества целых чисел, сумма которого равна нулю. Далее говорится, что это эквивалентно нахождению подмножества с суммой s для любого заданного s .

Поэтому я считаю, что, поскольку они эквивалентны, должно быть сокращение с обеих сторон. От s до нуля тривиально, если установить sзнак равно0 . Но мне не повезло найти сокращение от нуля до s , то есть, учитывая набор целых чисел A , построить набор целых чисел В содержащий подмножество с суммой s (для любых s ), если и только если существует подмножество A с сумма ноль.

Можете ли вы дать мне несколько советов?

IPSec
источник

Ответы:

11

У вас уже есть сокращение от специального к общему. Установив , вы в основном используете общий алгоритм для решения специальной задачи.sзнак равно0

Для обратного пути (то есть сокращения от общего к специальному):

Предположим , вы получаете множество и число K , и вы должны определить, есть ли некоторое подмножество S подводящих к K .Sзнак равно{Икс1,...,ИксN}КSК

Теперь вы хотите решить эту проблему, учитывая алгоритм для случая, когда вы можете определить, является ли какое-то подмножество суммой .0

Теперь, если , у нас есть простое сокращение: S = { x 1 , x 2 , , x n , - K } .Икся>0S'знак равно{Икс1,Икс2,...,ИксN,-К}

имеет подмножество сумму 0 тогдатолько тогда S имеет подмножество суммы K .S'0SК

Проблема возникает, когда мы можем иметь для некоторых из i .Икся0я

Можно предположить, что (почему?).К>0

Предположим , что сумма положительного это Р и отрицательный х я это Н .ИксяпИксяN

Теперь построим новый набор такой, чтоS'знак равно{Y1,Y2...,YN}

где M = P + | N | + К .Yязнак равноИкся+MMзнак равноп+|N|+К

Каждый .Yя>0

Теперь запустите алгоритм с нулевой суммой на множествах

S'{-(К+M)}

S'{-(К+2M)}

S'{-(К+3M)}

...

S'{-(К+NM)}

Легко показать, что если имеет подмножество суммы K , то, по крайней мере, один из вышеуказанных наборов имеет подмножество суммы ноль.SК

Я оставлю доказательство другого направления для вас.

Арьябхата
источник
Большое спасибо. Интересно, есть ли уменьшение, которое преобразует экземпляр суммы 0-подмножеств в один (вместо ) экземпляр суммы-подмножества K? n
ipsec
@ipsec: Вы имеете в виду преобразовать экземпляр K-subset-sum в 0-subset-sum? Возможно , сработает объединение из наборов выше. n
Арьябхата
Ну, я дважды подумал, получил ли я правильное направление сейчас. Когда я хочу показать, что сумма K-подмножеств NP-трудна для каждого K, учитывая тот факт, что сумма 0-подмножеств NP-сложна, я могу использовать сокращение от суммы 0-подмножеств до суммы K-подмножеств. , для которого мне понадобится преобразование времени из любого 0-экземпляра в K-экземпляр. Но сейчас я не уверен, что именно это я и задал в своем вопросе.
ipsec
@ipsec: Когда вы говорите set , вы показываете NP-Hardness K -subset-sum, учитывая NP-Hardness of zero-subset-sum: общая проблема, по крайней мере, такая же сложная, как и специальная проблема. Обратите внимание, что в терминах сокращения вы говорите, что сократили сумму с нулевым подмножеством до суммы K- подсетей. Также обратите внимание, что K является входом . Когда вы говорите о «каждом данном К », что именно вы имеете в виду? Приведенный выше ответ показывает, что особый случай (нулевая сумма подмножества) так же сложен (в смысле NP-жесткости), как и общий случай ( k -субсет-сумма, где k - вход). s=0KKKKkk
Арьябхата
Ничего. Что меня первоначально интересовало, так это то, что, если мы знаем, что 0-подмножество-сумма NP-сложна, можем ли мы вывести, что, например, 1-подмножество-сумма также? Википедия так говорит, но я искал правильное сокращение. Однако теперь я вижу, что моя формулировка была полностью испорчена, и я фактически спрашивал обратное. В любом случае, вы дали мне достаточно входных данных для того, чтобы сократить любой экземпляр K-subset-sum до экземпляра L-subset-sum для любых заданных целых чисел K и L, поэтому моя проблема все еще решена.
ipsec
0

Ответ Ариабхаты можно исправить, воспользовавшись тем фактом, что мы можем умножить все числа на несколько больших с , а затем добавить к каждому что-то маленькое, чтобы оно действовало как «тег присутствия», и затем предоставить некоторые дополнительные числа, которые позволят нам, чтобы добраться до нуля, если бы мы могли добраться до сК без них. В частности, мы будем использовать сзнак равно2(N+1) и 1 в качестве тега присутствия.

Учитывая экземпляр (Sзнак равно{Икс1,...,ИксN},К) общей проблемы с целевым значением К , мы создадим экземпляр конкретной проблемы (с целевым значением 0), который содержит:

  • Yзнак равно{Y1,...,YN} , гдеYязнак равно2(N+1)Икся+1 .
  • Число Zзнак равно-2К(N+1)-N .
  • N-1 копия номера 1, именуемая «подтягивающими» номерами.

Я предполагаю, что, как Арябхатта, К положителен. (Поскольку прошло 6 лет, я отвечу на его упражнение для читателя: причина, по которой мы можем это сделать, заключается в том, что если мы поменяем местами знаки всех чисел в случае общей проблемы, включая К , то мы получим новый, эквивалентный экземпляр задачи. Это означает, что для решения любой проблемы достаточно алгоритма для решения положительных К экземпляров - для решения экземпляра с отрицательным К мы могли бы выполнить эту замену знака, запустить этот алгоритм и переслать его ответ как ответ на оригинальный вопрос. И, конечно, если Кзнак равно0 тогда нам вообще не нужно выполнять преобразование общего случая в частный случай!)

Сначала давайте покажем, что ответ «ДА» на данный случай общей проблемы подразумевает ответ «ДА» на построенный экземпляр специальной задачи. Здесь можно предположить, что некоторое решение {ИксJ1,...,ИксJм} к общей задаче существует: то есть, это непустой набор т чисел сумм на K . Такесли мы примем соответствующие Y -значения { у J 1 , ... , у J т } в наше решение построенногонапример, они будут подводить к 2K ( n + 1 ) + mмКY{YJ1,...,YJм}2К(N+1)+м . Затем мы можем включить в решение -2К(N+1)-N , оставив нам сумму м-N . Так как 1мN , это в диапазоне [n+1,0] , который мы можем успешно увеличить до 0, включив некоторое подмножество номеров подтягивания.

Теперь давайте покажем, что ответ YES на построенный экземпляр подразумевает ответ YES на исходный данный экземпляр. Именно здесь умножение на 2(n+1) становится важным - это то, что позволяет нам быть уверенными, что дополнительные числа, которые мы включили, не могут «сделать слишком много».

Здесь можно предположить, что какое-то решение {yj1,,yjm} для построенного экземпляра: то есть этот непустой наборm чисел суммируется с 0. Согласно требованиям задачи это решение содержит хотя бы один элемент. Кроме того, он должен содержать по крайней мере один элемент изY , поскольку без этого невозможно получить общее количество 0: если присутствуют только подтягивающие числа, то сумма обязательно находится в диапазоне[1,n1] ( обратите внимание, что в этом случаепо крайней мере одиндолжен быть указан подтягивающий номер, и все они строго положительны, поэтому сумма не может быть 0); в то время как решение состоит только из z и некоторых подтягивающих чисел, тогда сумма обязательно будет отрицательной, потому что z=2K(n+1)nn и самое большее, что подтягивающие числа могут увеличить сумму по n1 .

Теперь предположим, что решение не содержит z . Каждый элемент в 1 = 2 n - 1 . В частности, это подразумевает, что сумма этих двух наборов терминов, взятых по модулю 2 (Y состоит из двух слагаемых: кратное2(n+1) и +1 «тег присутствия». Обратите внимание, что слагаемое +1 в каждом изn элементовY увеличивает сумму на 1, если выбран этот элемент, так же, как и каждое изn1 выбранных номеров подтягиваний, так что общее количество этих 2 Источники для любого решения - по крайней мере 1 (потому что мы установили в предыдущем параграфе, чтодолжен быть выбранпо крайней мере один элементY ) и самое большееn+n1=2n12(n+1) , отлична от нуля. В предположении, что решение не содержитz , единственными другими компонентами в этой сумме являются кратные2(n+1) внесенные выбранными членамиY , которые не влияют на значение суммы, когда берется по модулю2(n+1) . Таким образом, сумма всех членов в решении, когда взято по модулю2(n+1) , является ненулевым, означая, что оно не может быть равно целевой сумме 0, означая, что это не может быть действительным решением вообще: мы нашли противоречие, означающее, что должно быть, чтоz=2K(n+1)n присутствует в каждом решении в конце концов.

Таким образом, каждое решение содержит z . Мы знаем это

(2K(n+1)n)+i=1m(2(n+1)xji+1)+pull-ups=0 ,

и мы можем изменить условия:

2K(n+1)+i=1m(2(n+1)xji)(n+i=1m1+pull-ups)=0

2K(n+1)+i=1m(2(n+1)xji)(n+m+pull-ups)=0

2(n+1)(K+i=1mxji)(n+m+pull-ups)=0 .

Поскольку сумма равна 0, она должна оставаться равной 0, когда берется по модулю 2(n+1) , что подразумевает, что мы можем отбросить все члены, содержащие кратное 2(n+1) чтобы получить новое уравнение

(n+m+pull-ups)=0 .

Это можно напрямую подставить обратно в предыдущее уравнение, чтобы получить

2(n+1)(K+i=1mxji)=0.

Наконец, разделив обе стороны на 2(n+1) листа

K+i=1mxji=0,

что дает решение оригинального общего экземпляра проблемы.

j_random_hacker
источник