Если эта проблема должна быть решаема;тогда sum(ALL)/3
должно быть целым числом.Любое решение должно иметь SUM(J) + SUM(K) = SUM(I) + sum(ALL)/3
.Это решение 2-х секционной проблемы над concat(ALL, {sum(ALL)/3})
.
Вы говорите, что у вас есть 2-х секционная реализация: используйте ее для решения этой проблемы.Тогда (по крайней мере) один из двух разделов будет содержать число sum(ALL)/3
- удалите номер из этого раздела, и вы нашли I
.Для другого раздела снова запустите 2-раздел, чтобы разделить J
от K
;в конце концов, J
и K
должны быть равны в сумме.
Редактировать: Это решение, вероятно, неверно - 2-секция объединенногомножество будет иметь несколько решений (по крайней мере, одно для каждого из I, J, K) - однако, если есть другие решения, тогда «другая сторона» может не состоять из объединения двух из I, J, K и можетне разделяться на всех.Боюсь, вам нужно подумать: -).
Попробуйте 2: Выполните итерацию по мультимножеству, поддерживая следующую карту: R(i,j,k) :: Boolean
, которая представляеттот факт, что до текущей итерации числа допускают деление на три мультимножества с суммами i
, j
, k
.То есть для любого R(i,j,k)
и следующего числа n
в следующем состоянии R'
он содержит R'(i+n,j,k)
и R'(i,j+n,k)
и R'(i,j,k+n)
.Обратите внимание, что сложность (в соответствии с размером упражнения) зависит от величины от введенных чисел;это псевдополиномиальный алгоритм времени.Решение Nikita концептуально аналогично, но более эффективно, чем это решение, поскольку оно не отслеживает сумму третьего набора: это не нужно, поскольку его можно вычислить тривиально.