版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
背包問題實(shí)驗(yàn)題目:背包問題問題描述:假設(shè)有一個能裝入總體積為T的背包和n件體積分別為w1,w2,…,wn的物品,能否從n件物品中挑選若干件恰好裝滿背包,即使w1+w2+…+wn=T,要求找出所有滿足上述條件的解。例如:當(dāng)T=10,各件物品的體積{1,8,4,3,5,2}時,可找到下列4組解:(1,4,3,2) (1,4,5) (8,2) (3,5,2)。概要設(shè)計(jì):采用棧數(shù)據(jù)結(jié)構(gòu),利用回溯法的設(shè)計(jì)思想來解決背包問題。首先將物品排成一列,然后順序選取物品裝入背包,假設(shè)已選取了前i件物品之后背包還沒有裝滿,則繼續(xù)選取第i+1件物品,若該件物品“太大”不能裝入,則棄之而繼續(xù)選取下一件,直至背包裝滿為止。但如果在剩余的物品中找不到合適的物品以填滿背包,則說明“剛剛”裝入背包的那件物品“不合適”,應(yīng)將它取出“棄之一邊”,繼續(xù)再從“它之后”的物品中選取,如此重復(fù),直至求得滿足條件的解,或者無解。ADTStack{數(shù)據(jù)對象:D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}約定an端為棧頂,a1端為棧底。基本操作:InitStack(&S)操作結(jié)果:構(gòu)造一個空棧S。DestroyStack(&S)初始條件:棧S已存在。操作結(jié)果:棧S被銷毀。ClearStack(&S)初始條件:棧S已存在。操作結(jié)果:將S清為空棧。StackEmpty(S)初始條件:棧S已存在。操作結(jié)果:若棧S為空棧,則返回TRUE,否則FALSE。StackLength(S)初始條件:棧S已存在。操作結(jié)果:返回S的元素個數(shù),即棧的長度。GetTop(S,&e)初始條件:棧S已存在且非空。操作結(jié)果:用e返回S的棧頂元素。Push(&S,e)初始條件:棧S已存在。操作結(jié)果:插入元素e為新的棧頂元素。Pop(&S,&e)初始條件:棧S已存在且非空。操作結(jié)果:刪除S的棧頂元素,并用e返回其值。}ADTStack源代碼:#include<stdio.h>#include<stdlib.h>#include<math.h>#include<malloc.h>#defineOK1#defineN20FILE*fp1,*fp2;//fp1指向數(shù)據(jù)文件,fp2指向結(jié)果文件typedefstructSqStack{ int*base; int*top; intnum;}SqStack;structSqStack*S,L;intInitStack(SqStack*s,intn){ s->base=(int*)malloc(n*sizeof(int)); if(!s->base)exit(0); s->top=s->base; s->num=0; returnOK;}//創(chuàng)建棧intPush(SqStack*s,intm){ *s->top++=m; s->num++; returnOK;}//元素入棧intPop(SqStack*s,int*p){ if(s->base==s->top)return0;--s->top; *p=*s->top; s->num--; returnOK;}//元素出棧,用指針p返回intprint(SqStack*s,intw[]){ int*p; p=s->base; while(p<s->top){ fprintf(fp2,"%d",w[*p]); printf("%d",w[*p]); p++; } fprintf(fp2,"\n"); printf("\n"); returnOK;}//把棧中元素在文件中輸出和在屏幕上輸出intStackEmpty(SqStack*s){if(s->base==s->top)return0;elsereturn1;}//棧是否為空voidknapsack(intw[],intT,intn){//已知n件物品的體積分別為w[0],w[1],…,w[n],背包的總體積為T,//本算法輸出所有恰好能裝滿背包的物品組合解intk=0;//從第0件物品考察起intpint=0;//計(jì)算輸出結(jié)果組數(shù),如果沒有,則提示無結(jié)果int*pk=&k; S=&L;InitStack(S,n);do{if(Pop(S,pk)){//退出棧頂物品T+=w[k];k++;//繼續(xù)考察下一件物品 } while(T>0&&k<n){if(T-w[k]>=0){//第k件物品可選,則k入棧Push(S,k);T-=w[k];}k++;//繼續(xù)考察下一件物品 if(T==0){print(S,w); pint++;}//輸出第一組解 } } while((StackEmpty(S))&&(k<=n));//while if(!pint){ fprintf(fp2,”未找到匹配結(jié)果”); printf(“未找到匹配結(jié)果”); }}//knapsackintmain(intargc,char*argv[]){ //命令輸入為:(可執(zhí)行文件名)(輸入文件名)(輸出文件名) //例如:beibaoshuju.txtjieguo.txt //shuju.txt文件中輸入為:Tnw1w2...wn inti,n,T; inta[N]; if((fp1=fopen(argv[1],"r"))==NULL){ printf("文件未找到,請創(chuàng)建并輸入:"); exit(0); } if((fp2=fopen(argv[2],"w"))==NULL){ printf("創(chuàng)建文件失敗"); exit(0); } fscanf(fp1,"%d%d",&T,&n); for(i=0;i<n;i++){ fscanf(fp1,"%d",&a[i]);//從文件中讀入數(shù)據(jù) } knapsack(a,T,n); fclose(fp1); fclose(fp2);}/**beibao.c**Createdon:2009-10-23*Author:PB08210347*/數(shù)據(jù)檢測及結(jié)果:在命令行中輸入:beibaoshuju.txtjieguo.txt結(jié)果如下圖所示:命令行執(zhí)行:數(shù)據(jù)文件:結(jié)果文件:調(diào)試過程及分析:調(diào)試前,把一些語法等錯誤清楚后,發(fā)現(xiàn)沒有輸出運(yùn)行結(jié)果。之后進(jìn)行調(diào)試。調(diào)試時發(fā)現(xiàn)如下問題:??盏暮瘮?shù)返回值與調(diào)用時的值運(yùn)用錯誤。導(dǎo)致在knapsack函數(shù)中的循環(huán)循環(huán)一次就退出來了。因此,這種錯誤值得注意。接著,發(fā)現(xiàn)第一個循環(huán)while不能先判斷條件,而只需先做再判斷條件。之后就改為do……while循環(huán)。調(diào)試時,發(fā)現(xiàn)對棧中的元素個數(shù)不能清楚地看到,因此在棧的結(jié)構(gòu)體中加入了一個num域。這樣,調(diào)試時對棧就能清楚的了解其中入站和出站的過程。后來發(fā)現(xiàn)運(yùn)行只出現(xiàn)了三組結(jié)果。繼續(xù)考察,調(diào)試,其中,輸出三組結(jié)果后,循環(huán)跳出來了。原來?xiàng)V械脑匾呀?jīng)為空,即在新的元素入棧前,棧已為空
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 室內(nèi)裝修設(shè)計(jì)合同范本4
- 2024廠房轉(zhuǎn)讓合同協(xié)議書
- 新大學(xué)生暑期從化三下鄉(xiāng)社會實(shí)踐個人工作總結(jié)
- 2024年幼兒園中班班務(wù)上學(xué)期期末工作總結(jié)
- 施工質(zhì)量監(jiān)督管理安全生產(chǎn)培訓(xùn)
- 貴州城市職業(yè)學(xué)院《西醫(yī)外科學(xué)醫(yī)學(xué)免疫學(xué)與病原生物學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州財(cái)經(jīng)大學(xué)《藏族文化概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025青海省安全員-B證考試題庫附答案
- 2025安徽省建筑安全員《A證》考試題庫及答案
- 貴陽人文科技學(xué)院《形式化方法導(dǎo)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 工程力學(xué)課后習(xí)題答案1
- 6S視覺管理之定置劃線顏色管理及標(biāo)準(zhǔn)樣式
- 四年級數(shù)學(xué)(除數(shù)是兩位數(shù))計(jì)算題專項(xiàng)練習(xí)及答案
- 中考字音字形練習(xí)題(含答案)-字音字形專項(xiàng)訓(xùn)練
- 社區(qū)矯正個別教育記錄內(nèi)容范文
- 常見婦科三大惡性腫瘤的流行及疾病負(fù)擔(dān)研究現(xiàn)狀
- CTD申報(bào)資料撰寫模板:模塊三之3.2.S.4原料藥的質(zhì)量控制
- (正式版)JTT 1482-2023 道路運(yùn)輸安全監(jiān)督檢查規(guī)范
- 圍手術(shù)期血糖的管理
- 2024年度醫(yī)療器械監(jiān)督管理?xiàng)l例培訓(xùn)課件
- 100以內(nèi)不進(jìn)位不退位加減法練習(xí)題
評論
0/150
提交評論