Это гораздо больше вопрос алгоритма / доказательства, чем программирования / реализации, поэтому извиняюсь, если StackOverflow не подходит для этого.
Что касается проблемы:
предположим, что у нас есть набор чисел, и каждое число должно быть положительным целым числом и степенью 2
. Так, например, у нас есть {1, 1, 2, 4, 8, 8, 8, 8, 128}
. Мы хотим разделить набор на A
и B
, где каждый элемент должен быть точно в A
или B
, так, чтобы сумма элементов A
равнялась сумме элементов B
. Есть ли алгоритм полиномиального времени для этой ситуации, который всегда либо
- определить, что даже разделение не может существовать, или
- вернуть раздел на
A
иB
так, чтобы их суммы были равны?
Если нет алгоритма полиномиального времени, конечно, я хотел бы знать какое-то направление для доказательства этого (т.е., показывая эквивалентность другой NP-сложной проблеме).
Я знаю, что есть несколько проблем, которые могут помочь, и для контекста я резюмирую их здесь:
- Set-partition NP-жесткий. В set-partition у вас есть набор произвольных чисел. Решением является разделение A и B, где каждый элемент находится точно в A или B, так что
sum(A) = sum(B)
. - Подмножество-сумма NP-сложна. В subset-sum у вас есть набор произвольных чисел. Решение - это такое подмножество этого набора, что сумма элементов подмножества равна некоторому желаемому числу x.
Любая помощь приветствуется. Спасибо!