主题:toj1017 加分~~~~
Problem
你有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。
Input
该程序有多组测试数据,每组测试数据第一行为整数N(1<=N<=20),表示有N堆石子。接下去N行,为每堆石子的质量。
Output
每组测试数据只需输出合并后两堆的质量差的最小值。
Sample Input
5
5
8
13
27
14
2
4
4
Sample Output
3
0
var
t,i,j,k,n,m,p:longint;
a:array[1..20] of integer;
s,v:array[0..10000] of longint;
begin
while not seekeof(input) do
begin
m:=0;
fillchar(s,sizeof(s),0);
fillchar(v,sizeof(v),0);
readln(n);
for i:=1 to n do
begin
readln(a[i]);
m:=m+a[i];
end;
p:=0;
t:=0;
k:=maxlongint;
for i:=1 to n do
begin
p:=t;
for j:=0 to p do
begin
if v[s[j]+a[i]]<>1
then begin
V[S[J]+A[I]] :=1;
t:=t+1;
s[t]:=s[j]+a[i];
if abs((m-s[t])-s[t])<k
then k:=abs((m-s[t])-s[t]);
end;
end;
end;
writeln(k);
end;
end.
为什么总是Pascal Run Time Error Code 216
General protection fault
说明
一般保护错,程序试图访问指定范围外的内存空间
你有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。
Input
该程序有多组测试数据,每组测试数据第一行为整数N(1<=N<=20),表示有N堆石子。接下去N行,为每堆石子的质量。
Output
每组测试数据只需输出合并后两堆的质量差的最小值。
Sample Input
5
5
8
13
27
14
2
4
4
Sample Output
3
0
var
t,i,j,k,n,m,p:longint;
a:array[1..20] of integer;
s,v:array[0..10000] of longint;
begin
while not seekeof(input) do
begin
m:=0;
fillchar(s,sizeof(s),0);
fillchar(v,sizeof(v),0);
readln(n);
for i:=1 to n do
begin
readln(a[i]);
m:=m+a[i];
end;
p:=0;
t:=0;
k:=maxlongint;
for i:=1 to n do
begin
p:=t;
for j:=0 to p do
begin
if v[s[j]+a[i]]<>1
then begin
V[S[J]+A[I]] :=1;
t:=t+1;
s[t]:=s[j]+a[i];
if abs((m-s[t])-s[t])<k
then k:=abs((m-s[t])-s[t]);
end;
end;
end;
writeln(k);
end;
end.
为什么总是Pascal Run Time Error Code 216
General protection fault
说明
一般保护错,程序试图访问指定范围外的内存空间