| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
帮忙看看如何剪枝,我都想跳楼了!\\Report TIME OVER!!
~~~~~~~~~~
Type
int=integer;
Var
d:array[1..100]of int;
n,sum,max,min,i,j:int;
Function Check(x:int):boolean;
Var
w:array[1..100]of int;
m:int;
y:boolean;
Procedure Solve(k:int);
Var
i,j:int;
Begin
for i:=1 to m do
if (d[k]+w[i]=x)or(d[k]+w[i]+min<=x)
then begin
w[i]:=w[i]+d[k];
if k=n
then begin
y:=true;
for j:=1 to m do
if w[j]<>x
then begin
y:=false;
break;
end;
end
else Solve(k+1);
if y
then exit;
w[i]:=w[i]-d[k];
end;
End;
Begin
if sum=x
then exit(true);
m:=sum div x;
y:=false;
fillchar(w,sizeof(w),0);
Solve(1);
exit(y);
End;
BEGIN
While True Do Begin
readln(n);
if n=0 then break;
sum:=0; max:=0;
for i:=1 to n do
begin
read(d[i]);
sum:=sum+d[i];
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if d[i]<d[j]
then begin
d[i]:=d[i] xor d[j];
d[j]:=d[j] xor d[i];
d[i]:=d[i] xor d[j];
end;
max:=d[1]; min:=d[n];
for i:=max to sum do
if sum mod i=0
then if Check(i)
then begin
writeln(i);
break;
end;
End;
END.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator