There exists a solution, which involves dynamic programming, that runs in O(n*TotalSum)
, where n
is the number of elements in the array and TotalSum
is their total sum.
The first part consists in calculating the set of all numbers that can be created by adding elements to the array.
For an array of size n
, we will call this T(n)
,
T(n) = T(n-1) UNION { Array[n]+k | k is in T(n-1) }
(The proof of correctness is by induction, as in most cases of recursive functions.)
Also, remember for each cell in the dynamic matrix, the elements that were added in order to create it.
Simple complexity analysis will show that this is done in O(n*TotalSum)
.
After calculating T(n)
, search the set for an element exactly the size of TotalSum / 2
.
If such an item exists, then the elements that created it, added together, equal TotalSum / 2
, and the elements that were not part of its creation also equal TotalSum / 2
(TotalSum - TotalSum / 2 = TotalSum / 2
).
This is a pseudo-polynomial solution. AFAIK, this problem is not known to be in P.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…