公理,292字节
R==>reduce;F(b,c)==>for i in 1..#b repeat c;p(a)==(#a=0=>[a];w:=a.1;s:=p delete(a,1);v:=copy s;F(s,s.i:=concat([w],s.i));concat(v,s));m(a)==(#a=0=>[[0],a];#a=1=>[a,a];b:=p(a);r:=[a.1];v:=R(+,a)quo 2;m:=abs(v-a.1);F(b,(b.i=[]=>1;d:=abs(v-R(+,b.i));d<m=>(m:=d;r:=copy b.i);m=0=>break));[[m],r])
暴力应用程序。这将最小化设置
A={abs(reduce(+,a)quo 2-reduce(+,x))|x in powerSet(a)}
因为如果最小
y=min(A)=abs(reduce(+,a)quo 2-reduce(+,r))
这也是最小的
2*y=abs(reduce(+,a)-2*reduce(+,r))=abs((reduce(+,a)-reduce(+,r))-reduce(+,r))
其中(reduce(+,a)-reduce(+,r))和reduce(+,r)是两个袋子的2重量。(但最后一个公式对我而言没有找到最小值)。高低杠和结果
-- Return the PowerSet or the Powerlist of a
powerSet(a)==
#a=0=>[a]
p:=a.1;s:=powerSet delete(a,1);v:=copy s
for i in 1..#s repeat s.i:=concat([p],s.i)
concat(v,s)
-- Return one [[m], r] where
-- r is one set or list with reduce(+,r)=min{abs(reduce(+,a)quo 2-reudece(+,x))|x in powerSet(a)}
-- and m=abs(reduce(+,a) quo 2-reduce(+,r))
-- because each of two part, has to have the same weight
MinDiff(a)==
#a=0=>[[0],a]
#a=1=>[ a ,a]
b:=powerSet(a)
r:=[a.1];v:=reduce(+,a) quo 2;m:=abs(v-a.1)
for i in 1..#b repeat
b.i=[]=>1
k:=reduce(+,b.i)
d:=abs(v-k)
d<m=>(m:=d;r:=copy b.i)
m=0=>break
[[m],r]
--Lista random di n elmenti, casuali compresi tra "a" e "b"
randList(n:PI,a:INT,b:INT):List INT==
r:List INT:=[]
a>b =>r
d:=1+b-a
for i in 1..n repeat
r:=concat(r,a+random(d)$INT)
r
(5) -> a:=randList(12,1,10000)
(5) [8723,1014,2085,5498,2855,1121,9834,326,7416,6025,4852,7905]
Type: List Integer
(6) -> m(a)
(6) [[1],[1014,2085,5498,1121,326,6025,4852,7905]]
Type: List List Integer
(7) -> x:=reduce(+,m(a).2);[x,reduce(+,a)-x]
(7) [28826,28828]
Type: List PositiveInteger
(8) -> m([1,2,3,4])
(8) [[0],[2,3]]
Type: List List Integer
(9) -> m([10,1,2,3,4])
(9) [[0],[10]]
Type: List List Integer
(10) -> m([40,20,80,50,100,33,2])
(10) [[0],[40,20,100,2]]
Type: List List Integer
(11) -> m([7,7,7,10,11])
(11) [[0],[10,11]]
Type: List List Integer