Сума підмножини: зменшити спеціальний до загального випадку


20

Вікіпедія заявляє про задану суму підмножини як знаходження підмножини заданого множинного числа цілих чисел, сума якого дорівнює нулю. Далі йдеться про те, що це рівнозначно пошуку підмножини з сумою s для будь-якого заданого s .

Тому я вважаю, що вони рівноцінні, і в будь-якій із сторін має бути скорочення. Один від s до нуля тривіальний, задаючи s=0 . Але мені не пощастило знайти скорочення від нуля до s , тобто, задавши набір цілих чисел A , побудуйте набір цілих чисел B що містять підмножину з сумою s (для будь-яких s ), якщо і тільки якщо є як підмножина A з сума нуля.

Чи можете ви дати мені кілька покажчиків?

Відповіді:


11

Ви фактично вже маєте скорочення від спеціального до загального. Встановлюючи s=0 , ви в основному використовуєте загальний алгоритм для вирішення спеціальної проблеми.

З іншого боку (тобто зменшення від загального до спеціального):

Припустимо , ви отримуєте безліч S={x1,,xn} і число K , і ви повинні визначити, чи є деяка підмножина S підвідних до K .

Тепер ви хочете вирішити цю проблему, задавши алгоритм для випадку, коли ви можете визначити, чи підмножина дорівнює 0 .

Тепер, якщо xi>0 , ми маємо просте скорочення: S={x1,x2,,xn,K} .

має підмножина суму 0 тодітільки тоді S має підмножина суми K .S0SK

Проблема виникає, коли ми можемо мати для деяких з i .xi0i

Можна вважати, що (чому?).K>0

Припустимо , що сума позитивного це Р і негативний х я це Н .xiPxiN

Тепер побудуйте новий набір такий, щоS={y1,y2,yn}

де M = P + | N | + К .yi=xi+MM=P+|N|+K

Кожен .yi>0

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

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

Неважко показати, що якщо має підмножину суми K , то, принаймні, один із зазначених наборів має підмножину нульової суми.SK

Я залишу доказ іншого напрямку вам.


Велике спасибі. Цікаво, чи існує скорочення, яке перетворює екземпляр суми 0-підмножини в один (замість ) екземпляр K-підмножини? n
ipsec

@ipsec: Ви маєте на увазі перетворити екземпляр суми K-підмножини в суму 0-підмножини? Можливо, прийняття об'єднання вищевказаних наборів спрацює. n
Ар'ябхата

Що ж, я насправді двічі замислювався, чи отримав я зараз жорсткий напрямок. Коли я хочу показати, що сума K-підмножини є NP-важкою для кожного K, враховуючи той факт, що сума 0-підмножини є NP-жорсткою, я можу використати зменшення з 0-сукупності підмножини до суми K-підмножини , для якого мені потрібно багаточасова трансформація з будь-якого 0-екземпляра в K-екземпляр. Але я зараз не впевнений, що це насправді те, про що я задав своє запитання.
ipsec

@ipsec: Коли ви говорите, що задано , ви показали NP-твердість K -субсет-суми, враховуючи NP-твердість нульової підмножини: загальна проблема є щонайменше такою ж важкою, як і спеціальна проблема. Зауважте, що в термінах скорочення ви говорите, що ви зменшили суму нульової підмножини до K -субсет-суми. Також зауважте, що K - це вхід . Коли ви говорите про "кожен заданий К ", що саме ви маєте на увазі? Вищенаведена відповідь показує, що спеціальний випадок (нульова підмножина-сума) такий же важкий (у значенні NP-твердості), як і загальний випадок ( k -субсет-сума, де k - вхід). s=0KKKKkk
Ар'ябхата

Не зважай. Мені спочатку було цікаво, якщо ми знаємо, що сума 0-підмножин є важкою для NP, чи можемо ми отримати, що, наприклад, сума 1-підмножини є такою ж? У Вікіпедії так сказано, але я шукав належного скорочення. Однак зараз я бачу, що моє формулювання було повністю зіпсовано, і я насправді запитував протилежне. У будь-якому випадку ви дали мені достатній внесок для зменшення з будь-якого екземпляра суми K-підмножини до екземпляра суми L-підмножини для будь-яких заданих цілих чисел K і L, тому моя проблема все ще вирішена.
ipsec

0

Відповідь Арябхати можна виправити, скориставшись тим, що ми можемо помножити всі числа на кілька великих c , а потім додати до кожного щось невелике, щоб діяти як "тег присутності", а потім подати кілька додаткових чисел, які дозволять нам дістатися до нуля, якби ми змогли дістатися до cK без них. Зокрема, ми будемо використовувати c=2(n+1) і 1 як тег присутності.

З огляду на екземпляр (S={x1,,xn},K) загальної проблеми із цільовим значенням K , ми створимо екземпляр конкретної проблеми (із цільовим значенням 0), який містить:

  • Y={y1,,yn} , деyi=2(n+1)xi+1 .
  • Число z=2K(n+1)n .
  • n1 примірник числа 1, який слід називати "підтягуючими" номерами.

Я вважаю, що Аріабхатта робить це K позитивним. (Оскільки минуло 6 років, я відповім на його вправу для читача: причина, яку ми можемо зробити це, полягає в тому, що якщо ми поміняємо знаки всіх чисел на екземпляр загальної проблеми, включаючи K , то ми закінчуємо новий, еквівалентний екземпляр проблеми. Це означає, що алгоритму для вирішення екземплярів додатного K достатньо, щоб вирішити будь-яку проблему - щоб вирішити екземпляр з негативним K , ми могли б виконати цю підміну підписання, запустити цей алгоритм і надіслати свою відповідь як відповідь на вихідне запитання. І звичайно, якщо K=0 тоді нам взагалі не потрібно проводити будь-яку трансформацію загальної справи в особливу справу!)

Спочатку покажемо це відповідь ТА на даний екземпляр загальної проблеми передбачає відповідь ТА на побудований екземпляр спеціальної проблеми. Тут ми можемо припустити , що якийсь - то рішення {xj1,,xjm} до загальної задачі існує: тобто, це непорожній набір m чисел сум на K . Отже, якщо ми візьмемо відповідні значення y значень {yj1,,yjm} в наше рішення для побудованого екземпляра, вони будуть дорівнювати 2K(n+1)+m . Тоді ми можемо вибрати, щоб включити2K(n+1)n у розчин, залишаючи нам сумуmn . Оскільки1mn , це в діапазоні[n+1,0] , який ми можемо успішно витягнути до 0, включивши деякий підмножина підсувних чисел.

Тепер покажемо, що відповідь YES на побудований екземпляр передбачає відповідь YES на початковий даний екземпляр. Тут стає важливим множення на 2(n+1) - саме це дозволяє нам бути впевненим, що додаткові числа, які ми включили, не можуть "зробити занадто багато".

Тут можна припустити, що якесь рішення {yj1,,yjm}для побудованого екземпляра існує: тобто ця непуста колекціяmчисел дорівнює 0. Відповідно до проблемних вимог, це рішення містить в хоча б один елемент. Далі він повинен містити принаймні один елемент зY, оскільки без цього неможливо досягти загальної кількості 0: Якщо присутні лише підсувні числа, то сума обов'язково знаходиться в діапазоні[1,n1]( зауважте, що в цьому випадкухоча б одинномер підтягувача повинен бути присутнім, і всі вони суворо позитивні, тому сума не може бути 0); тоді як якщо рішення складається з просто z і деяких підтягуючих чисел, то загальна сума обов'язково від’ємна, оскільки z=2K(n+1)nn і найбільше, що підсумні числа можуть збільшити суму by є n1 .

Тепер припустимо протиріччя, що рішення не містить z . Кожен елемент у Y складається з двох доданків: кратне 2(n+1) та +1 "тег присутності". Зауважте, що додаток +1 для кожного з n елементів Y збільшує суму на 1, якщо цей елемент обраний, як і кожне з обраних до n1 підтягуючих чисел, тому загальна сума, внесена цими 2 джерел будь-якого рішення становить щонайменше 1 (тому що в попередньому пункті ми встановили, що принаймні один елемент Y повинен бути обраний) і щонайменше n+n1=2n1 . Зокрема, це означає, що сума цих двох наборів доданків,якщо взяти модуль2(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 ,

що дає вирішення оригінальному екземпляру загальної проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.