У вас уже есть сокращение от специального к общему. Установив , вы в основном используете общий алгоритм для решения специальной задачи.s=0
Для обратного пути (то есть сокращения от общего к специальному):
Предположим , вы получаете множество и число K , и вы должны определить, есть ли некоторое подмножество S подводящих к K .S={x1,…,xn}KSK
Теперь вы хотите решить эту проблему, учитывая алгоритм для случая, когда вы можете определить, является ли какое-то подмножество суммой .0
Теперь, если , у нас есть простое сокращение: S ′ = { x 1 , x 2 , … , x n , - K } .xi>0S′={x1,x2,…,xn,−K}
имеет подмножество сумму 0 тогдатолько тогда S имеет подмножество суммы K .S′0SK
Проблема возникает, когда мы можем иметь для некоторых из i .xi≤0i
Можно предположить, что (почему?).K>0
Предположим , что сумма положительного это Р и отрицательный х я это Н .xiPxiN
Теперь построим новый набор такой, чтоS′={y1,y2…,yn}
где M = P + | N | + К .yi=xi+MM=P+|N|+K
Каждый .yi>0
Теперь запустите алгоритм с нулевой суммой на множествах
S'∪ { - ( K+ М) }
S'∪ { - ( K+ 2 М) }
S'∪ { - ( K+ 3 М) }
...
S'∪ { - ( K+ n M) }
Легко показать, что если имеет подмножество суммы K , то, по крайней мере, один из вышеуказанных наборов имеет подмножество суммы ноль.SК
Я оставлю доказательство другого направления для вас.
Ответ Ариабхаты можно исправить, воспользовавшись тем фактом, что мы можем умножить все числа на несколько большихс , а затем добавить к каждому что-то маленькое, чтобы оно действовало как «тег присутствия», и затем предоставить некоторые дополнительные числа, которые позволят нам, чтобы добраться до нуля, если бы мы могли добраться до с К без них. В частности, мы будем использовать c = 2 ( n + 1 ) и 1 в качестве тега присутствия.
Учитывая экземпляр( S= { х1, … , ХN} , К) общей проблемы с целевым значением К , мы создадим экземпляр конкретной проблемы (с целевым значением 0), который содержит:
Я предполагаю, что, как Арябхатта,К положителен. (Поскольку прошло 6 лет, я отвечу на его упражнение для читателя: причина, по которой мы можем это сделать, заключается в том, что если мы поменяем местами знаки всех чисел в случае общей проблемы, включая К , то мы получим новый, эквивалентный экземпляр задачи. Это означает, что для решения любой проблемы достаточно алгоритма для решения положительных К экземпляров - для решения экземпляра с отрицательным К мы могли бы выполнить эту замену знака, запустить этот алгоритм и переслать его ответ как ответ на оригинальный вопрос. И, конечно, если К= 0 тогда нам вообще не нужно выполнять преобразование общего случая в частный случай!)
Сначала давайте покажем, что ответ «ДА» на данный случай общей проблемы подразумевает ответ «ДА» на построенный экземпляр специальной задачи. Здесь можно предположить, что некоторое решение{ хJ1, … , ХJм} к общей задаче существует: то есть, это непустой набор т чисел сумм на K . Такесли мы примем соответствующие Y -значения { у J 1 , ... , у J т } в наше решение построенногонапример, они будут подводить к 2K ( n + 1 ) + mм К Y { уJ1, ... , уJм} 2K( n + 1 ) + m . Затем мы можем включить в решение - 2 К( n + 1 ) - n , оставив нам сумму м - н . Так как 1 ≤ m ≤ n , это в диапазоне [−n+1,0] , который мы можем успешно увеличить до 0, включив некоторое подмножество номеров подтягивания.
Теперь давайте покажем, что ответ YES на построенный экземпляр подразумевает ответ YES на исходный данный экземпляр. Именно здесь умножение на2(n+1) становится важным - это то, что позволяет нам быть уверенными, что дополнительные числа, которые мы включили, не могут «сделать слишком много».
Здесь можно предположить, что какое-то решение{yj′1,…,yj′m′} для построенного экземпляра: то есть этот непустой наборm′ чисел суммируется с 0. Согласно требованиям задачи это решение содержит хотя бы один элемент. Кроме того, он должен содержать по крайней мере один элемент изY , поскольку без этого невозможно получить общее количество 0: если присутствуют только подтягивающие числа, то сумма обязательно находится в диапазоне[1,n−1] ( обратите внимание, что в этом случаепо крайней мере одиндолжен быть указан подтягивающий номер, и все они строго положительны, поэтому сумма не может быть 0); в то время как решение состоит только из z и некоторых подтягивающих чисел, тогда сумма обязательно будет отрицательной, потому что z=−2K(n+1)−n≤−n и самое большее, что подтягивающие числа могут увеличить сумму по n−1 .
Теперь предположим, что решение не содержитz . Каждый элемент в 1 = 2 n - 1 . В частности, это подразумевает, что сумма этих двух наборов терминов, взятых по модулю 2 (Y состоит из двух слагаемых: кратное2(n+1) и +1 «тег присутствия». Обратите внимание, что слагаемое +1 в каждом изn элементовY увеличивает сумму на 1, если выбран этот элемент, так же, как и каждое изn−1 выбранных номеров подтягиваний, так что общее количество этих 2 Источники для любого решения - по крайней мере 1 (потому что мы установили в предыдущем параграфе, чтодолжен быть выбранпо крайней мере один элементY ) и самое большееn+n−1=2n−1 2(n+1) , отлична от нуля. В предположении, что решение не содержитz , единственными другими компонентами в этой сумме являются кратные2(n+1) внесенные выбранными членамиY , которые не влияют на значение суммы, когда берется по модулю2(n+1) . Таким образом, сумма всех членов в решении, когда взято по модулю2(n+1) , является ненулевым, означая, что оно не может быть равно целевой сумме 0, означая, что это не может быть действительным решением вообще: мы нашли противоречие, означающее, что должно быть, чтоz=−2K(n+1)−n присутствует в каждом решении в конце концов.
Таким образом, каждое решение содержитz . Мы знаем это
и мы можем изменить условия:
Поскольку сумма равна 0, она должна оставаться равной 0, когда берется по модулю2(n+1) , что подразумевает, что мы можем отбросить все члены, содержащие кратное 2(n+1) чтобы получить новое уравнение
Это можно напрямую подставить обратно в предыдущее уравнение, чтобы получить
Наконец, разделив обе стороны на2(n+1) листа
что дает решение оригинального общего экземпляра проблемы.
источник