Как отметил amit, этот алгоритм можно понимать как пример проблемы разбиения .Для простой реализации взгляните на этот код Python:
def partition(A):
n = len(A)
if n == 0:
return 0
k, s = max(A), sum(A)/2.0
table = [0 if x else 1 for x in xrange(n*k)]
for i in xrange(n):
for j in xrange(n*k-1, -1, -1):
if table[j-A[i]] > table[j]:
table[j] = 1
minVal, minIdx = float('+inf'), -1
for j in xrange(int(s)+1):
if table[j] and s-j < minVal:
minVal, minIdx = s-j, j
return int(2*minVal)
При вызове с одним из входов в вопросе:
partition([10, 50, 60, 65, 90, 100])
Он вернет 5
, как и ожидалось,Для полного понимания математики, лежащей в основе решения, ознакомьтесь с этими примерами и нажмите ссылку «Сбалансированный раздел».