比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,?可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。 程序说明{重要,可以先自己设计算法}
以N=4为例,即有16个0,16个1,数组A用以记录32个0,1的排法,数组B统计二进制数是否已出现过。 程序清单
VAR
A :ARRAY[1..36] OF 0..1; B :ARRAY[0..31] OF INTEGER; I,J,K,S,P:INTEGER; BEGIN
FOR I:=1 TO 36 DO A[I]:=0; FOR I:=28 TO 32 DO A[I]:=1; P:=1;A[6]:=1; WHILE (P=1) DO BEGIN J:=27;
WHILE A[J]=1 DO J:=J-1; ( ① )
FOR I:=J+1TO 27 DO( ② ) FOR I:=0 TO 31 DO B[1]:=O; FOR I:=1 TO 32 DO BEGIN
( ③ )
FOR K:=I TO I+4 DO S:=S*2+A[K]; ( ④ ) END; S:=0;
FOR I:=0 TO 31 DO S:=S+B[I]; IF( ⑤ )THEN P:=0 END;
FOR I:=1 TO 32 DO FOR J:=I TO I+4 DO WRITE(A[J]); WRITELN END.
37
1、A[J]:=1; 2、A[I]:=0; 3、S:=0; 4、B[S]:=1; 5、S=32
问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,??sk,定义整数P为:
22222
P=(S1-S2)+(S1一S3)+??+(S1-Sk)+(s2-s3)+??+(Sk-1-Sk) 问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉 程序说明:
数组:a[1],a[2],...A[N]存放原数 s[1],s[2],...,s[K]存放每个部分的和 b[1],b[2],...,b[N]穷举用临时空间 d[1],d[2],...,d[N]存放最佳方案 程序:
program exp4;
Var i,j,n,k : integer;
a :array [1..100] of integer; b,d:array [0..100] of integer; s :array[1..30] of integer; begin
readln(n,k);
for I:=1 to n do read(a[I]); for I:=0 to n do b[I]:=1; cmin:=1000000; while (b[0]=1) do begin
for I:=1 to k do ① for I:=1 to n do ② sum:=0;
for I:=1 to k-1 do
for j:= ③ sum:=sum+(s[I]-s[j])*(s[I]-s[j]);
if ④ then begin
cmin:=sum;
for I:=1 to n do d[I]:=b[I]; end; j:=n;
while ⑤ do j:=j-1; b[j]:=b[j]+1;
for I:=j+1 to n do ⑥ end;
38
writeln(cmin);
for I:=1 to n do write(d[I]:40); writeln; end.
1、 s[k]:=0;
2、 s[b[i]]:= s[b[i]]+a[i]; 3、 i+1 to k 4、 sum 在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。 A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,?最后到达B。通路上路段距离之和称为通路距离(最大距离≤1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。 例如:下图所示是当N=1时的情况: 从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。 算法说明:本题采用穷举算法。 数据结构:N:记录A,B间路站的个数 数组D[I,0]记录第I-1到第I路站间路段的个数 D[I,1],D[I,2],?记录每个路段距离 数组G记录可取到的距离 程序清单: PROGRAM CHU7_6; VAR I,J,N,S:INTEGER; B:ARRAY[0..100]OF INTEGER; D:ARRAY[0..100,0..20]OF INTEGER; G :ARRAY[0..1000]OF 0..1; BEGIN READLN(N); FOR I:=1 TO N+1 DO BEGIN READLN(D[I,0]); FOR J:=1 TO D[I,0]DO READLN(D[I,J]); END; D[0,0]:=1; FOR I:=1 TO N+1 DO B[I]:=1; B[0]:=0; 39 FOR I:=0 TO 1000 DO G[I]:=0; WHILE ① DO ????b[0]=0 BEGIN S:=0; FOR I:=1 TO N+1 DO S:= ② ????s+d[i,b[i]]; G[S]:=1;J:=N+1; WHILE ③ DO J:=J-1; ????b[j]=d[j,0] B[J]:=B[J]+1; FOR I:=J+1 TO N+1 DO B[I]:=1; END; S:=0; FOR I:=1 TO 1000 DO ④ ; ????s:=s+g[i] WRITELN(S);READLN; END. 模拟 存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的空间为可用的(如图一中(a))。 此时,可用空间可用一个二维数组dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]对应第i个可用空间首址,dk[i,2]对应第i个可用空间长度如上图中,dk: 0 100 100 300 500 0 50 100 100 0 50 100 100 300 500 10000 表一(a) 表一(b) 现某个作业释放一个区域,其首址为d,长度为L,此时将释放区域加入到可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的4种情况: (1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为表二中的(a)。 (2)上靠,例如,d=600,L=50,此时表成为表二中的(b)。 (3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。 (4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。 40

