##Haskell, 51 bytes
f l=snd$minimum$((,)=<<abs.sum)<$>mapM(\x->[x,-x])l
Output format is that left-hand weights are positive and right-hand weights are negative.
>> f [2,1,5,4,7]
[-2,-1,5,4,-7]
To generate every possible split, we use mapM(\x->[x,-x])l
to negate every possible subset of elements. Then, ((,)=<<abs.sum)
labels each one with its absolute sum and snd$minimum$((,)=<<abs.sum)
take the smallest-labeled element.
I couldn't get it point-free because of type-checking issues.