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