程序: program gxp2;
Var i, j ,k, n :integer;
p:boolean;
b :array [0..20] of 0..1;
a :array[1..20,1..10] of integer; begin readln(n,k); for i:=1 to k do begin
for j:=1 to n do read(a[i,j]); readln; end;
for i:=O to n do b[i]:=0; p:=true;
while ① do begin
j:=n;
while b[j]=1 do j:=j-1; ② ③ for i:=j+1 to n do b[I]:=0; for i:=1 to k do
for j:=1 to n do
if( a[i,j]=1 ) and (b[j]=0) or ④ then p:=true; {明确p的含义}
end;
if ⑤ then writeln('找不到!‘) else for i:=1 to n do
if (b[i]=1) then writeln('物质',i,’需要')
else writeln('物质',i,'不需要');
end.
1、P AND (B[0]=0) 2、B[J]:=1; 3、P:=FALSE; 4、(A[I,J]=-1) AND (B[J]=1)
5、P
将2n个0和2n个1,排成一个圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。要求给出一种排法,用上面的方法产生出来的n+1
2个二进制数都不相同。
例如,当n=2时,即22个0和22个1排成如下一圈:
比如,从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.
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为:
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
2
2
2
2
2
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;
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; 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]