回 帖 发 新 帖 刷新版面

主题: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 

说明

一般保护错,程序试图访问指定范围外的内存空间
  

回复列表 (共3个回复)

沙发

没人会吗?

板凳

label
1;
var
a,b:array[1..20]of longint;
x,k,n,f,e,x1,x2:longint;
begin
while not seekeof do
begin
readln(n);
for n:=1 to n do
readln(a[n]);
for x:=1 to 2**n do
begin
x1:=x;
x2:=x;
e:=0;
for k:=n downto 1 do
begin
b[k]:=x2 mod 2;
x2:=x2 div 2;
if b[k]=1 then e:=e-a[k] else e:=e+a[k];
end;
if (abs(e)<f) or (x1=1)
then
f:=abs(e);
if f<=1 then goto 1;
end;
1:writeln(f);
end;
end.

我的AC程序。。。。。。。。。算法不是很好,有点投机取巧的感觉。。。不过还是过了

3 楼

偶想知道偶错在哪里了~~~~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册