版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、背包問題的三種解法實驗報告實驗要求:分別用動態(tài)規(guī)劃法、回溯法、分支限界法解決0/1背包問題,了解三種算法的算法步驟并上機實現(xiàn)。實驗步驟:1. 建立一個背包問題的解法類Bag.h。bag_m為動態(tài)規(guī)劃法,bag_b為回溯法,bag_t為分支限界法。2. 建立一個排序類Sortl.h。程序的需要對背包的價值比排序。3. 由分支限界建立一個動態(tài)的最大堆及堆的各種操作和運算類SqList.h。代碼實現(xiàn):1. 主函數(shù):/背包問題的解法#in elude <iostream>#inelude "Bag.h"/背包問題處理方法類using n amespaee std;int
2、 mai n()int i,n ,M;eout<<"請輸入物品個數(shù):”;cin»n;double *m=new double n+1;double *p=new double n+1;eout< <"輸入每個物品的重量:"for(i=1;i<=n ;i+)cin>> mi;eout< <"輸入每個物品的價值:"for(i=1;i<=n ;i+)cin> >pi;eout<<"請輸入背包的重量: "ein >>M;Bag
3、bag;/創(chuàng)建一個背包問題的解法類對象eout<<"選擇背包問題的解法,輸入 1,動態(tài)規(guī)劃法,輸入2,回溯法,輸入 3,分支限界法。"<<'n'<<"請輸入1或者2,或者輸入3:"<<""ein> >i;if(i=1)bag.bag_m(m,p,n,M); /調用動態(tài)規(guī)劃法if(i=2)bag.bag_b(m,p,n,M); / 調用回溯法if(i=3)bag.bag_t(m,p,n,M); /調用分支限界法return 0;2. 排序方法類:(File na
4、me: Sort1.h)/合并排序類(合并排序)#in elude <iostream>using n amespace std;struct objdouble m;double p;double v;;typedef struct obj OBJ; /定義物體的數(shù)據(jù)結構class Sortlpublic:void merge_sort(OBJ a,int n) / 以物體的價值比排序 int i,s,t=1;while(t <n)s=t;t=2*s;i=0;while(i+t <n)merge(a,i,i+s-1,i+t-1,t);i=i+t;if(i+s <
5、n)merge(a,i,i+s-1, n-1, n_i);void merge(OBJ a,i nt p,i nt q,i nt r,i nt n)OBJ *bp=new OBJ n;int i,j,k;i=p;j=q+1;k=O;while(i<=q&&j<=r)if(ai.v<=aj.v)bpk+=ai+;elsebpk+=aj+;if(i=q+1)for(;j<=r;j+)bpk+=aj;elsefor(;i<=q;i+)bpk+=ai;k=0;for(i=p;i<=r;i+)ai=bpk+;delete bp;3. 背包問題解法類:(
6、File name: Bag.h)/背包問題方法類(包含三種方法)/bag_m動態(tài)規(guī)劃法/bag_b 回溯法bag_t分支限界法#in elude <iostream>using n amespace std;#i nclude "Sortl.h"#i nclude "SqList.h"class Bag/動態(tài)規(guī)劃法public:void bag_m(double *m,double *p,i nt n ,i nt M) int i,j;int *x=new in t n+1;OBJ *objs=new OBJ n+1;objs0.m=0;o
7、bjs0.p=0;objs0.v=0;for(i=1;i<=n ;i+)objsi.m=mi;objsi.p=pi;objsi.v=objsi.m/objsi.p;double *optp;optp=new double *n+1;for(i=0;i< n+1;i+)optpi=new doubleM+1;xi=0;for(i=0;i<=n ;i+)optpi0=0;for(i=0;i<=M;i+)optp0i=0;for(i=1;i<=n ;i+)for(j=1;j<=M;j+)if(objsi.m>j)optpij=optpi-1j;elseopt
8、pij=optpi-1j;if(optpij<(optpi-1i nt(j-objsi.m)+objsi.p) optpij=(optpi-1i nt(j-objsi.m)+objsi.p);i=n ;j=M;while(i&&j)if(optpij>optpi-1j)xi=1;j-=objsi.m;elsexi=O;i-;cout<<"輸出結果,裝入為 1,不裝入為0:"<<'n'for(i=1;i<=n ;i+)cout<<xi<<""cout<&
9、lt;'n'cout<<"背包物體的總價值最大為:"<<optp nM<<'n'delete x,objs;for(i=0;i<=n ;i+)delete optpi;delete optp;void bag_b(double *m,double *p,i nt n,i nt M)回溯法int i,j,k;int *x=new intn +1;int *y=new in t n+2;double m_cur,m_est,p_cur,p_est,p_total;m_cur=0;p_cur=0;p_tot
10、al=0;OBJ *objs=new OBJ n+1;objs0.m=0;objs0.p=0;objs0.v=0;for(i=1;i<=n ;i+)objsi.m=mi;objsi.p=pi;objsi.v=objsi.m/objsi.p;yi=o;xi=0;y n+1=0;Sort1 sort;sort.merge_sort(objs,n+1);/ 排序k=1;while(k>=1)p_est=p_cur;m_est=m_cur;for(i=k;i<=n ;i+)m_est=m_est+objsi.m;if(m_est<M)p_est=p_est+objsi.p;el
11、sep_est=p_est+(M_m_est+objsi.m)/objsi.m)*objsi.p; break;if(p_est>p_total)for(i=k;i<=n ;i+)if(m_cur+objsi.m<=M)m_cur+=objsi.m;p_cur+=objsi.p;yi=1;else yi=0; break;if(i>=n)if(p_cur>p_total)p_total=p_cur;k =n+1;for(j=1;j<=n ;j+)xj=yj;else k=i+1;elsewhile(i>=1 && yi=O)i-;if(
12、i<1) break;elsem_cur-=objsi.m;p_cur-=objsi.p;yi=0;k=i+1;for(i=1;i<=n ;i+)cout<<xi;cout<<'n'cout<<"total="<<p_total;delete x,y,objs;void bag_t(double *m,double *p,int n,int M) / 分支限界法 int i;double t;OBJ *ob=new OBJ n;for(i=0;i< n;i+)obi.m=mi+1;obi.p=
13、pi+1;obi.v=obi.m/obi.p;Sort1 sort;sort.merge_sort(ob ,n);Knapnode kna,knax,knay;/定義左節(jié)點和右節(jié)點kn a.b=O;k na.k=O;k na.p=O;k na.w=O;for(i=0;i<5;i+)kn a.s1i=0;for(i=k na.k,t=k na.w;i <n ;i+)if(t+obi.m<=M)t+=obi.m;kn a.b+=obi.p;elsekn a.b+=(M-t)*obi.p/obi.m; break;sqlist q;SqList sq;sq.ln itList_Sq
14、(q);sq.i nsert(q,k na);while(q.le ngth!=O)kn a=sq.delete_max(q);if(k na.k=5)cout<<"the value is:"<<k na.p<<'n' for(i=0;i<5;i+)cout<<k na.s1i<<""cout<<'n'break;knay=kna;kn ay.k+;k nay.b=k nay.p;for(i=k nay.k,t=k nay.w;i <n
15、;i+)if(t+obi.m<=M)t+=obi.m;kn ay.b+=obi.p;elsekn ay.b+=(M-t)*obi.p/obi.m; break;sq.i nsert(q,k nay);knax=kna;if(k nax.w+obk nax.k.m>M)con ti nue;kn ax.s1k nax.k=1;kn ax.w+=obk nax.k.m;kn ax.p+=obk nax.k.p;kn ax.k+;sq.i nsert(q,k nax);4.動態(tài)堆方法類(分支限界方法中用到,F(xiàn)ile name : SqList.h)/動態(tài)最大堆#in clude <
16、iostream>#i nclude "math.h"#i nclude <ioma nip>using n amespace std;#define ListInitSize 20#defi ne List In creme nt 10const n=5;typedef structint s1 n;int k;float b;float w;float p;Knapnode;typedef struct sqListKnapnode *elem;int len gth;int listsize;sqlist;class SqList / 動態(tài)堆類pub
17、lic:void InitList_Sq(sqlist &L)n為單位元素的大小,初始化堆L.elem=(Knapnode *)malloc(ListI nitSize* sizeof(K napno de);if(L.elem=NULL) exit(OVERFLOW);L.le ngth=O;L.l istsize=Listl nitSize;void Listlnsert_Sq(sqlist &L,Knapnode elem) / 向堆中插入節(jié)點Knapnode * n ewbase;if(L.len gth>=L .li stsize)n ewbase=(K nap
18、node*)realloc(L.elem,(L .li stsize+ListI ncreme nt)sizeof(K napno de);if(n ewbase=NULL) exit(OVERFLOW);L.elem=n ewbase;L.li stsize+=ListI ncreme nt;L.elem+L.le ngth=elem;void sift_up(sqlist &L,int i)/ 上移操作while(i>=2)if(L.elemi.b>L.elemi/2.b)swap(L.elemi/2,L.elemi);i/=2;else break;void sift
19、_down(sqlist &L,int i) / 下移操作int don e=0;i=2*i;while(do ne=0&&i<=L.len gth)if(i+1<=L.le ngth&&L.elemi+1.b>L.elemi.b)i+;if(L.elemi/2.b<L.elemi.b)swap(L.elemi/2,L.elemi);else don e=1;void swap(K napnode &a,K napnode &b)Knapnode t; t=a; a=b;b=t;void insert(sqlist
20、 &L,Knapnode x) / 插入節(jié)點后,并排序ListI nsert_Sq(L,x); sift_up(L,Len gth);Knapnode delete_max(sqlist &L) /刪除堆中預測價值的最大者 Knapnode p;p=L.elem1;swap(L.elem1,L.elemL.le ngth);L.len gth-;sift_dow n( L,1);return p;void print(sqlist &L) / 打印堆的數(shù)據(jù)int i;for(i=1;i<=Len gth;i+)cout<<L.elemi.b;運行方法和
21、結果(用這三種算法分別給出實驗結果):1.動態(tài)規(guī)劃法:c:? *C: VFr octu Fi lesMlicrosoft ¥i sual 3todi o WyFro i >e c t請鎖入物品個數(shù);5 匾買每乍桝品的重豊 濤狗入直包旳垂旦 選掛背咼110 0 1cout«-瑜入每于物品的重里="':forCl=l;i<=n;i+*icin»mi;cout«"輸入每個物品的價值":ForCl-1:i<=n:i+)cin»pi;cout«-itj入背包的重量:11 ; dn»
22、;M;Bag亦g?"創(chuàng)建一個直包問題的讎法類 “吐y選擇背包冋融解怯,輸天九 cin»i;bag-bag_m(msp,nsMJ;/調用動態(tài)規(guī)劃* iF(i=Z)bag.bag-bCmsPn.MJ;/調用回溯祛 if(l3)bag-bag_tCmap,n,M);/ 用分支限界J:return 6;2 2 & & 46 3 5 4 6: 10頂題的解法,輸入X動態(tài)規(guī)劃法, 起竜息者輸入亂 1 £棗入為桑不裝入為慣包物體舸總價值最大為 15Press 孔ny key to continue2.回溯法:UOULfXC"<LIUUU>Xe|Bl|->r I J v輸入每個物品的重量:For(i=1;i<=n;i+>dn»nl;cout«-入每個物品的價值;For(i=1 ;K=r>i+>cin»p i ;cout«請輸入背包的重量;&q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 散客旅游合同范本在線查看
- 企業(yè)車輛交易協(xié)議書模板
- 2024體育賽事場地租賃合同
- 2024版土石方運輸合同
- 農村個人購房合同范例
- 合伙協(xié)議書范例
- 如何簽訂借款合同避免風險
- 個人汽車買賣合同樣本模板
- 2023年高考地理專題復習新題典題精練-洋流(原卷版)
- 致大海選擇性必修中冊 第四單元課件
- (必練)廣東省軍隊文職(經濟學)近年考試真題試題庫(含答案)
- 含羞草天氣課件
- 2024年安全生產知識競賽考試題庫及答案(共五套)
- 22《鳥的天堂》課件
- 農業(yè)灌溉裝置市場環(huán)境與對策分析
- 新疆烏魯木齊市第十一中學2024-2025學年八年級上學期期中道德與法治試卷
- 2024年江西省高考地理真題(原卷版)
- 部編版小學五年級上冊道法課程綱要(知識清單)
- 經濟法學-計分作業(yè)一(第1-4章權重25%)-國開-參考資料
- 山東省臨沂市(2024年-2025年小學四年級語文)人教版期中考試(上學期)試卷及答案
- 護士2024思想?yún)R報5篇
評論
0/150
提交評論