![ACM培訓(xùn)第二次_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/27/153a0c4a-62b5-4f53-b4a7-ababeddc7624/153a0c4a-62b5-4f53-b4a7-ababeddc76241.gif)
![ACM培訓(xùn)第二次_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/27/153a0c4a-62b5-4f53-b4a7-ababeddc7624/153a0c4a-62b5-4f53-b4a7-ababeddc76242.gif)
![ACM培訓(xùn)第二次_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/27/153a0c4a-62b5-4f53-b4a7-ababeddc7624/153a0c4a-62b5-4f53-b4a7-ababeddc76243.gif)
![ACM培訓(xùn)第二次_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/27/153a0c4a-62b5-4f53-b4a7-ababeddc7624/153a0c4a-62b5-4f53-b4a7-ababeddc76244.gif)
![ACM培訓(xùn)第二次_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/27/153a0c4a-62b5-4f53-b4a7-ababeddc7624/153a0c4a-62b5-4f53-b4a7-ababeddc76245.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 acm競賽經(jīng)典算法計(jì)算機(jī)與信息技術(shù)學(xué)院 目 錄第四次課 深度搜索3第五次課深搜211第六次課深搜()14第七次課 深搜()21第八次課 寬搜(1)29第九次課寬搜(2)+雙向搜索35第十次課啟發(fā)式搜索a*(寬搜的變式)42第四次課 深度搜索 在我們遇到的一些問題當(dāng)中,有些問題我們不能夠確切的找出數(shù)學(xué)模型,即找不出一種直接求解的方法,解決這一類問題,我們一般采用搜索的方法解決。搜索就是用問題的所有可能去試探,按照一定的順序、規(guī)則,不斷去試探,直到找到問題的解,試完了也沒有找到解,那就是無解,試探時一定要試探完所有的情況(實(shí)際上就是窮舉);對于問題的第一個狀態(tài),叫初始狀態(tài),要求的狀態(tài)叫目標(biāo)狀態(tài)。
2、搜索就是把規(guī)則應(yīng)用于實(shí)始狀態(tài),在其產(chǎn)生的狀態(tài)中,直到得到一個目標(biāo)狀態(tài)為止。產(chǎn)生新的狀態(tài)的過程叫擴(kuò)展(由一個狀態(tài),應(yīng)用規(guī)則,產(chǎn)生新狀態(tài)的過程)搜索的要點(diǎn):(1)初始狀態(tài); (2)重復(fù)產(chǎn)生新狀態(tài); (3)檢查新狀態(tài)是否為目標(biāo),是結(jié)束,否轉(zhuǎn)(2);如果搜索是以接近起始狀態(tài)的程序依次擴(kuò)展?fàn)顟B(tài)的,叫寬度優(yōu)先搜索。如果擴(kuò)展是首先擴(kuò)展新產(chǎn)生的狀態(tài),則叫深度優(yōu)先搜索。深度優(yōu)先搜索深度優(yōu)先搜索用一個數(shù)組存放產(chǎn)生的所有狀態(tài)。(1) 把初始狀態(tài)放入數(shù)組中,設(shè)為當(dāng)前狀態(tài);(2) 擴(kuò)展當(dāng)前的狀態(tài),產(chǎn)生一個新的狀態(tài)放入數(shù)組中,同時把新產(chǎn)生的狀態(tài)設(shè)為當(dāng)前狀態(tài);(3) 判斷當(dāng)前狀態(tài)是否和前面的重復(fù),如果重復(fù)則回到上一個狀態(tài),
3、產(chǎn)生它的另一狀態(tài);(4) 判斷當(dāng)前狀態(tài)是否為目標(biāo)狀態(tài),如果是目標(biāo),則找到一個解答,結(jié)束算法。(5) 如果數(shù)組為空,說明無解。(6) 轉(zhuǎn)到() 對于pascal語言來講,它支持遞歸,在遞歸時可以自動實(shí)現(xiàn)回溯(利用局部變量)所以使用遞歸編寫深度優(yōu)先搜索程序相對簡單,當(dāng)然也有非遞歸實(shí)現(xiàn)的算法。 1、 迷宮(左上角入口,右下角出口,找到一條通路。)1110101111100011程序如下:const d:array1.4,1.4of integer=(1,1,0,0),(0,1,1,1),(1,1,0,1),(0,1,1,1); c:array1.4,1.2of -1.1=(0,1),(0,-1),(
4、1,0),(-1,0);var a:array1.16,1.2of integer; i,j:integer;procedure play(k:integer); var i:integer; begin if (ak,1=4)and(ak,2=4) then begin for i:=1 to k do write('(',ai,1,',',ai,2,')'); writeln; readln; exit; end; for i:=1 to 4 do if (ak,1+ci,1>0)and(ak,1+ci,1<5) and(ak,2
5、+ci,2>0)and(ak,2+ci,2<5) then if dak,1,ak,2=1 then begin dak,1,ak,2:=2; ak+1,1:=ak,1+ci,1; ak+1,2:=ak,2+ci,2; play(k+1); dak,1,ak,2:=1; end;end;begin fillchar(a,sizeof(a),0); a1,1:=1;a1,2:=1; play(1);end.2、 8數(shù)碼八數(shù)碼問題是指這樣一種游戲:將分別標(biāo)有數(shù)字1,2,3,8的八塊正方形數(shù)碼牌任意地放在一塊3×3的數(shù)碼盤上。放牌時要求不能重疊。于是,在3×3的數(shù)碼盤
6、上出現(xiàn)了一個空格(0表示空格)?,F(xiàn)在要求按照每次只能將與空格相鄰的數(shù)碼牌與空格交換的原則,將任意擺放的數(shù)碼盤逐步擺成某種特殊的排列。如下圖所示:567408321507461382程序如下:type node=array1.3,1.3of 0.8;const st:node=(2,8,3),(1,6,4),(7,0,5); gl:node=(1,2,3),(8,0,4),(7,6,5); rl:array1.4,1.2of-1.1=(0,1),(0,-1),(1,0),(-1,0);var a:array1.20of node;function result(k:integer):boolea
7、n; var i,x,y:integer;begin result:=false; for x:=1 to 3 do for y:=1 to 3 do if ak,x,y<>glx,y then exit; result:=true;end;procedure look(k:integer;var x,y:integer); var i,j:integer; begin for i:=1 to 3 do for j:=1 to 3 do if ak,i,j=0 then begin x:=i;y:=j;end; end;procedure print(k:integer); var
8、 i,x,y:integer;begin for i:=1 to k do begin writeln('step:',i); for x:=1 to 3 do begin for y:=1 to 3 do write(ai,x,y:3); writeln; end; writeln('-'); end; end;function nrep(k:integer):boolean; var i,x,y:integer; f:boolean; begin nrep:=false; for i:=1 to k-1 do begin f:=true; for x:=1
9、to 3 do for y:=1 to 3 do if ai,x,y<>ak,x,y then begin f:=false;break;break;end; if f then exit; end; nrep:=true; end;procedure step(k:integer); var i,x,y:integer; begin if k>=20 then exit; if result(k) then begin print(k);exit;end; look(k,x,y); for i:=1 to 4 do begin if (x+rli,1>=1)and(x
10、+rli,1<=3)and(y+rli,2<=3)and(y+rli,2>=1)then begin ak+1:=ak; ak+1,x+rli,1,y+rli,2:=ak,x,y; ak+1,x,y:=ak,x+rli,1,y+rli,2; if nrep(k+1) then step(k+1); end; end; end; begin a1:=st; step(1);end.3、 跳馬(5*5)國際象棋8*8棋盤上某個位置的一只馬,按馬的行走規(guī)則,每個方格進(jìn)入一次.,它是否可能只走63步,正好走過除起點(diǎn)外的其他63個位置各一次?如果有一種這樣的走法,則稱所走的這條路線為一
11、條馬的周游路線。試設(shè)計(jì)一個算法找出這樣一條馬的周游路線并輸出。本題采用5*5的棋盤。程序如下:const d:array1.8,1.2of -2.2=(-2,1),(-2,-1),(1,2),(1,-2),(2,-1),(2,1),(-1,-2),(-1,2);var a:array1.5,1.5of 0.1;procedure print; var i,j:integer; begin for i:=1 to 5 do begin for j:=1 to 5 do write(ai,j:3); writeln; end; readln; end;procedure play(x,y:inte
12、ger); var i:integer; begin if (x=5)and(y=5) then begin print;exit;end; for i:=1 to 8 do if (x+di,1>0)and(x+di,1<6)and(y+di,2>0)and(y+di,2<6)and(ax+di,1,y+di,2=0 )then begin ax+di,1,y+di,2:=1; play(x+di,1,y+di,2); end; end;begin fillchar(a,sizeof(a),0); a1,1:=1; play(1,1);end.4、倒油80、50、30
13、三個容器,不帶刻度,把80分成兩個40.初始(80,0,0)->目標(biāo)(40,40.0)程序如下:const v:array1.3of integer=(80,50,30);var a:array1.30,1.3of integer;procedure print(k:integer); var i:integer; begin for i:=1 to k do writeln('step:',i,ai,1:3,ai,2:3,ai,3:3); readln; end;function nrep(k:integer):boolean; var i:integer; begin
14、 nrep:=false; for i:=1 to k-1 do if (ai,1=ak,1)and(ai,2=ak,2)then exit; nrep:=true; end;procedure step(k:integer); var i,j:integer; begin if (ak,1=40)and(ak,2=40) then begin print(k);exit;end; for i:=1 to 3 do for j:=1 to 3 do if (i<>j)and(ak,i>0)and(ak,j<vj) then begin ak+1:=ak; if (ak,
15、i+ak,j>vj )then begin ak+1,i:=ak,i+ak,j-vj; ak+1,j:=vj;end else begin ak+1,i:=0;ak+1,j:=ak,i+ak,j;end; if nrep(k+1) then step(k+1); end; end; begin a1,1:=80; a1,2:=0; a1,3:=0; step(1); end.5、狼、羊、菜過河(農(nóng)夫過河問題)規(guī)則是:獵人每次只能帶一樣過河,而狼吃羊,羊吃菜,不能沒有獵人在時在一起。算出過河的方案。程序如下:var a:array1.30,1.4of integer;procedure p
16、rint(k:integer); var i:integer; begin for i:=1 to k do writeln('step:',i,ai,1:3,ai,2:3,ai,3:3,ai,4:3); readln; end;function can(k:integer):boolean; var i:integer; begin can:=false; if (ak,2=ak,3)and(ak,2<>ak,1)or(ak,3=ak,4)and(ak,3<>ak,1) then exit; i:=k-2; while i>0 do begin
17、if (ai,1=ak,1)and(ai,2=ak,2)and(ai,3=ak,3)and(ai,4=ak,4) then exit; i:=i-2; end; can:=true; end;procedure step(k:integer); var i:integer; begin if ak,1+ak,2+ak,3+ak,4=0 then begin print(k);exit;end; for i:=1 to 4 do begin if i>1 then begin ak+1:=ak; ak+1,i:=1-ak,i; ak+1,1:=1-ak,1; end else begin
18、ak+1:=ak; ak+1,1:=1-ak,1; end; if can(k+1) then step(k+1); end; end;begin a1,1:=1; a1,2:=1; a1,3:=1; a1,4:=1; step(1);end.6、野人和傳教士過河野人和傳教士各三人,小船只能載兩人,要求野人的人數(shù)不能多于傳教士。算出過河的方案總數(shù)。程序如下:const c:array1.5,1.2of 0.2=(1,0),(0,1),(2,0),(0,2),(1,1);var a:array1.30,1.2of integer;procedure print(k:integer); var i
19、,j:integer; begin for i:=1 to k do begin writeln('step:',i,ai,1:3,ai,2:3); end; end;function can(k:integer):boolean; var i:integer; begin can:=false; if (ak,1>3)or(ak,1<0)or(ak,2>3)or(ak,2<0) then exit; if (ak,1>ak,2)and(ak,2>0)or(ak,1<ak,2)and(ak,2<3) then exit; i:=k
20、-2; while i>0 do begin if (ai,1=ak,1) and(ai,2=ak,2) then exit; i:=i-2; end; can:=true; end;procedure step(k,p:integer); var i:integer; begin if ak,1+ak,2=0 then begin print(k);exit;end; for i:=1 to 5 do begin ak+1,1:=ak,1+p*ci,1; ak+1,2:=ak,2+p*ci,2; if can(k+1) then step(k+1,-p); end;end;begin
21、a1,1:=3; a1,2:=3; step(1,-1);end.第五次課深搜21、n2的棋盤,填1n2個數(shù),要求下比上大,左比右大。程序如下:var a:array0.11,0.11of integer; b:array0.200of boolean; n,s:integer;procedure print; var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(ai,j:3); writeln; end; writeln('-'); readln; end;procedure try(x,y
22、:integer); var i,j:integer; begin if (x=n+1) then begin inc(s);print;exit;end; if y=n+1 then try(x+1,1)else begin j:=0; if (y>=1)and(ax,y-1>j) then j:=ax,y-1; if (x>=1)and(j<ax-1,y)then j:=ax-1,y; for i:=j+1 to n*n-(n-x+1)*(n-y+1)+1 do if bi then begin ax,y:=i; bi:=false; try(x,y+1);bi:=
23、true; end; end; end;begin readln(n); fillchar(b,sizeof(b),true); s:=0; try(1,1); writeln(s);end.2、n*n方陣中填號,使得每行每列都有m個(m<=n)共n*m個。(角度:共n*m個,則考慮放到哪個格子里,ax,y表示在x行里的位置,y表示的個數(shù)。)程序如下:var a:array1.10,0.10of integer; b:array1.10of integer; n,m,s:integer;procedure print; var x,y,k:integer; begin for x:=1
24、to n do begin k:=1; for y:=1 to n do if ax,k=y then begin write('*':2);k:=k+1;end else write('+':2); writeln; end; writeln; end;procedure try(x,y:integer); var i:integer; begin if x>n then begin print;inc(s);exit;end; if y>m then try(x+1,1) else for i:=ax,y-1+1 to n-m+y do begi
25、n ax,y:=i;bi:=bi+1; if (bi<=m)and(bi>=m-(n-x) then try(x,y+1); bi:=bi-1; end; end;begin readln(n,m); s:=0; fillchar(b,sizeof(b),0); fillchar(a,sizeof(a),0); try(1,1); writeln(s);end.3、中國盒”abababab_” ->”aaaa_bbbb”;程序如下:var a:array1.1000of string10; i,j:integer;procedure print(k:integer); var
26、 i:integer; begin for i:=1 to k do writeln(ai); end;function nrep(k:integer):boolean; var i:integer; begin nrep:=false; for i:=1 to k-1 do if ai=ak then exit; nrep:=true; end;procedure try(k:integer); var i:integer;begin if ak-1='aaaa_bbbb'then begin print(k-1);exit;end; for i:=1 to 9 do if
27、ak-1,i='_' then break; for j:=1 to 9 do if (j+1<i)or(j>i+1) then begin ak:=ak-1; ak,i:=ak-1,j; ak,i+1:=ak-1,j+1; ak,j:='_' ak,j+1:='_' if nrep(k) then try(k+1); end;end;begin a1:='abababab_' try(2);end.第六次課深搜()搜索:問題的表示、狀態(tài)(初始狀態(tài)-目標(biāo)狀態(tài))、變化的規(guī)則。判合法、判重復(fù)、判結(jié)果最優(yōu)解的求法:用一個變量
28、去存放最優(yōu)解,每次去比,搜一遍,挑一個最優(yōu)的。角度:哪個角度的工作量最少,就從哪個角度去搜即搜的次數(shù)最少。次序:選擇哪個次序,把最好的放在前面,把不好的放在后邊。深度:深度為m,寬度為n,則搜索的次數(shù)為nm,所以盡量減少深度,把一些不可能的深度讓其退出,就是優(yōu)化。寬度:把無效的給濾掉。展望:求最優(yōu)解時適用。先把最優(yōu)解給存起來,如果一個值明顯比最優(yōu)解不好,則讓他退出,就是優(yōu)化。、 任務(wù)的最佳安排。源程序名arrange.?(pas|c|cpp)輸入文件名arrange.in輸出文件名arrange.out時間限制1s/testcase空間限制32mb- 問題描述給省隊(duì)選拔賽命題的時候,周老師手下
29、有n個命題人,要命n種不同類型的試題,其中每人命每一類型的試題一題。因?yàn)槊總€命題人對不同題型的掌握程度不同,所以他們編出的試題難度也有不同(這用一個難度數(shù)值來表示)。為了盡可能地刁難大家,周老師決定出一張n個題的試卷,每一類型的試題一題,而且所有題的難度值總和最大。- 輸入數(shù)據(jù)第一行為n(n <= 20),代表命題人的個數(shù)。(40%的數(shù)據(jù)n<=10)以后n行,每行n個整數(shù)(每個數(shù)不超過100),第i行j列的數(shù)表示第i個人出的第j種題目的難度大小。- 輸出數(shù)據(jù)一行,表示試卷難度的最大值。- 樣例輸入350 50 110 100 10100 10 10- 樣例輸出201程序如下:var
30、 a:array1.20,1.20of integer; b:array1.20of boolean; d:array0.21of integer; max,n,i,j:integer; f:text;procedure step(x,s:integer); var i,j:integer; begin if s+dx+1<=max then exit; if x>n then if s>max then begin max:=s; exit;end; for i:=1 to n do if bi then begin bi:=false; step(x+1,s+ax,i);
31、 bi:=true; end; end;begin assign(f,'input.in'); reset(f); readln(f,n); for i:=1 to n do begin for j:=1 to n do read(f,ai,j); readln(f); end;加展望 close(f); dn+1:=0; for i:=n downto 1 do begin di:=ai,1; for j:=2 to n do if ai,j>di then di:=ai,j; di:=di+di+1; end; max:=0; fillchar(b,sizeof(b)
32、,true); step(1,0); writeln(max);end.、 背包問題(01)要么裝,要么不裝,不允許切割。(1)設(shè)有一個背包可以放入的物品重量為v,現(xiàn)有n件物品,重量分別為w1,w2,.wn。問能否從這n件物品中選擇若干件放入此背包,使得放入的重量之和最接近或正好為v。變式:裝箱問題問題描述有一個箱子容量為v(正整數(shù),0v20000),同時有n個物品(0n30,每個物品有一個體積(正整數(shù))。要求n個物品中,任取若干個裝入箱內(nèi),使箱子的剩余空間為最小。樣例輸入:24
33、0; 一個整數(shù),表示箱子容量6 一個整數(shù),表示有n個物品8 接下來n行,分別表示這n 個物品的各自體積312797輸出:0 一個整數(shù),表示箱子剩余空間。程序如下:uses dos;var a:array1.50 of integer; b:array0.50 of integer; v,n,min:integer; h,f,m,m1:word;procedure init;var f:text; i,j,k:integer;begin assign(f,'10.txt
34、'); reset(f); readln(f,v); readln(f,n); for i:=1 to n do readln(f,ai); close(f); for i:=1 to n-1 do for j:=i+1 to n do if ai<aj then begin k:=ai;ai:=aj;aj:=k;end;end;procedure try(k,s:integer);var i:integer;begin if s<min then min:=s; if s<an then exit; for i:=bk-1+1 to n do if ai<=s
35、 then begin bk:=i; try(k+1,s-ai); end;end;begin gettime(h,f,m,m1); writeln(h,':',f,':',m,':',m1); init; min:=v; b0:=0; try(1,v); writeln(min); gettime(h,f,m,m1); writeln(h,':',f,':',m,':',m1);end.程序如下:、 背包問題,求背包的價值值最大。n個物品重量和價值對應(yīng)關(guān)系如圖所示,求價值最大。三、采藥(medic
36、.pas/c/cpp) 【問題描述】 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫(yī)師。為此,他想拜附近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個難題。醫(yī)師把他帶到一個到處都是草藥的山洞里對他說:“孩子,這個山洞里有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間里,你可以采到一些草藥。如果你是一個聰明的孩子,你應(yīng)該可以讓采到的草藥的總價值最大?!?如果你是辰辰,你能完成這個任務(wù)嗎? 【輸入文件】 輸入文件medic.in的第一行有兩個整數(shù)t(1 <= t <= 1000)和m
37、(1 <= m <= 100),用一個空格隔開,t代表總共能夠用來采藥的時間,m代表山洞里的草藥的數(shù)目。接下來的m行每行包括兩個在1到100之間(包括1和100)的整數(shù),分別表示采摘某株草藥的時間和這株草藥的價值。 【輸出文件】 輸出文件medic.out包括一行,這一行只包含一個整數(shù),表示在規(guī)定的時間內(nèi),可以采到的草藥的最大總價值。 【樣例輸入】 70 371 10069 11 2 【樣例輸出】 3 【數(shù)據(jù)規(guī)?!?#160;對于30%的數(shù)據(jù),m <= 10;對于全部的數(shù)據(jù),m <= 100。程序如下
38、:vara:array1.100,1.2of integer;k:array1.2of integer; b:array0.100of integer; f:text; t,m,max,i,j:integer;procedure try(k,t1,s:integer); var i:integer; begin if s>max then max:=s; if t1<am+1,1 then exit; for i:=bk-1+1 to m do if ai,1<=t1 then begin bk:=i;try(k+1,t1-ai,1,s+ai,2);end; end;begi
39、n assign(f,'medic1.in'); reset(f); readln(f,t,m); for i:=1 to m do readln(f,ai,1,ai,2); close(f);b0:=0; am+1,1:=a1,1;for i:=2 to m do if am+1,1>ai,1 then am+1,1:=ai,1; am+1,1存放最小時間值 for i:=1 to m-1 do for j:=i+1 to m do if ai,2/ai,1<aj,2/aj,1 then begin k:=ai; ai:=aj;aj:=k;end;max:=0;
40、try(1,t,0); writeln(max);end.第七次課 深搜()一、 棋子控制棋盤的棋盤上的每棵棋子都可以控制它的上下左右不能放棋子,求可以控制整個棋盤的最少棋子數(shù)。const c:array1.5,1.2of integer=(0,1),(0,-1),(1,0),(-1,0),(0,0);var a,b:array0.6,0.6of integer; min:integer;procedure lookup(var x,y:integer);var i,j:integer; begin for i:=1 to 5 do for j:=1 to 5 do if ai,j=0 the
41、n begin x:=i;y:=j;exit; end; x:=0 end;procedure try(k:integer); var x,y,xx,yy,i,j:integer;begin if min<=k-1 then exit; lookup(x,y); if x=0 then begin min:=k-1;b:=a;exit;end; for i:=1 to 5 do begin xx:=x+ci,1; yy:=y+ci,2; if (xx>0)and(xx<6)and(yy>0)and(yy<6)then begin inc(axx,yy,10); f
42、or j:=1 to 4 do inc(axx+cj,1,yy+cj,2); try(k+1); for j:=1 to 4 do dec(axx+cj,1,yy+cj,2); dec(axx,yy,10); end;end;end;begin fillchar(a,sizeof(a),0); min:=15; try(1); writeln(min);end. inc(axx,yy,10); for j:=1 to 4 do inc(axx+cj,1,yy+cj,2); try(k+1); for j:=1 to 4 do dec(axx+cj,1,yy+cj,2); dec(axx,yy,
43、10); end;end;end;begin fillchar(a,sizeof(a),0); min:=8; try(1); writeln(min);end.二、均分?jǐn)?shù)據(jù)源程序名data.?(pas|c|bas)輸入文件名data.in輸出文件名data.out【問題描述】已知n個正整數(shù):a1、a2、an 。今要將它們分成m組(x1,x2,xm),使得各組數(shù)據(jù)的數(shù)值和最平均,即各組的和與各組和的平均值的差的絕對值的和最小。公式如下:x=(x1+x2+xm)my=x1xx2xxmxx是各組數(shù)據(jù)和的平均值,i為第i組數(shù)據(jù)的數(shù)值和。即求所有分法中值的最小值。【輸入文件】輸入文件data.in包括
44、:第一行是兩個整數(shù),表示n,m的值(n是整數(shù)個數(shù),m是要分成的組數(shù))第二行有n個整數(shù),表示a1、a2、an。整數(shù)的范圍是1-50。(同一行的整數(shù)間用空格分開)【輸出文件】輸出文件data.out包括一行,這一行只包含一個數(shù),表示各組的和與各組和的平均值的差的絕對值的和的最小值(四舍五入后保留2位小數(shù))。【樣例】若輸入文件data.in中的內(nèi)容為: 6 31 2 3 4 5 6則輸出文件data.out中的內(nèi)容應(yīng)為0 00(1和6、2和5、3和4分別為一組)【問題規(guī)?!?0%的數(shù)據(jù)2<=n<=10,m=2100%的數(shù)據(jù)m<=n <= 20,2<=m<=5算法一
45、:以每個數(shù)為出發(fā)點(diǎn),搜索它放的組別。var a,b:array1.20 of integer; n,m,i:integer; p,min:real; f:text; c:char;procedure try(k:integer);var i:integer; s:real;begin if k>n then begin s:=0; for i:=1 to m do s:=s+abs(bi-p); if s<min then min:=s; exit; end; for i:=1 to m do begin bi:=bi+ak; try(k+1); bi:=bi-ak; end;en
46、d;begin assign(f,'data.in'); reset(f); readln(f,n,m); for i:=1 to n do read(f,ai); close(f); p:=0; for i:=1 to n do p:=p+ai; p:=p/m; min:=10000000; fillchar(b,sizeof(b),0); try(1); assign(f,'data.out'); rewrite(f); writeln(f,min:4:2); close(f);end.算法二:以組為出發(fā)點(diǎn),搜索它內(nèi)部放的數(shù)。組內(nèi)是無序的,各數(shù)之間是組合問題;組間也是無序的,也是組合問題。組的控制只須把未被使用的第一個數(shù)定為該組的第一個元素,以后元素按組合的方式搜索。var a:array1.100 of integer; n,m,i,s,j:integer; b:array1.100 of boolean; c:array1.30,1.100 of integer;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高精度磨削液H-1項(xiàng)目投資可行性研究分析報告
- 2025年度餐飲連鎖銷售經(jīng)理合同
- 養(yǎng)殖棚出租合同范本
- 代理記賬返稅合同范本
- 公司請律師合同范例
- 加盟店合作合同范本
- 2025年度工業(yè)污染源整治環(huán)境整治施工合同
- 憑證附件采購合同范本
- 冠名授權(quán)合同范本
- 臨時混凝土采購合同范例
- 2 找春天 公開課一等獎創(chuàng)新教學(xué)設(shè)計(jì)
- 2025年江蘇護(hù)理職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年江蘇南京水務(wù)集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 【道法】開學(xué)第一課 課件-2024-2025學(xué)年統(tǒng)編版道德與法治七年級下冊
- 建筑工程施工安全管理課件
- 2025年春新外研版(三起)英語三年級下冊課件 Unit2第1課時Startup
- 2025年上半年畢節(jié)市威寧自治縣事業(yè)單位招考考試(443名)易考易錯模擬試題(共500題)試卷后附參考答案
- 處方點(diǎn)評知識培訓(xùn)
- 2025年新合同管理工作計(jì)劃
- 2024年02月北京2024年中信銀行北京分行社會招考(0223)筆試歷年參考題庫附帶答案詳解
- 2024年高考語文備考之文言文閱讀簡答題答題指導(dǎo)
評論
0/150
提交評論