背包问题的三种解法代码实现_第1页
背包问题的三种解法代码实现_第2页
背包问题的三种解法代码实现_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、背包问题的三种解法实验报告实验要求:分别用动态规划法、回溯法、分支限界法解决0/1背包问题,了解三种算法的算法步骤并上机实现。实验步骤:1. 建立一个背包问题的解法类Bag.h。bag_m为动态规划法,bag_b为回溯法,bag_t为分支限界法。2. 建立一个排序类Sortl.h。程序的需要对背包的价值比排序。3. 由分支限界建立一个动态的最大堆及堆的各种操作和运算类SqList.h。代码实现:1. 主函数:/背包问题的解法#in elude <iostream>#inelude "Bag.h"/背包问题处理方法类using n amespaee std;int

2、 mai n()int i,n ,M;eout<<"请输入物品个数:”;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;/创建一个背包问题的解法类对象eout<<"选择背包问题的解法,输入 1,动态规划法,输入2,回溯法,输入 3,分支限界法。"<<'n'<<"请输入1或者2,或者输入3:"<<""ein> >i;if(i=1)bag.bag_m(m,p,n,M); /调用动态规划法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; /定义物体的数据结构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动态规划法/bag_b 回溯法bag_t分支限界法#in elude <iostream>using n amespace std;#i nclude "Sortl.h"#i nclude "SqList.h"class Bag/动态规划法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;/定义左节点和右节点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.动态堆方法类(分支限界方法中用到,File name : SqList.h)/动态最大堆#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 / 动态堆类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) / 向堆中插入节点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) / 插入节点后,并排序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) / 打印堆的数据int i;for(i=1;i<=Len gth;i+)cout<<L.elemi.b;运行方法和

21、结果(用这三种算法分别给出实验结果):1.动态规划法:c:? *C: VFr octu Fi lesMlicrosoft ¥i sual 3todi o WyFro i >e c t请锁入物品个数;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?"创建一个直包问题的讎法类 “吐y选择背包冋融解怯,输天九 cin»i;bag-bag_m(msp,nsMJ;/调用动态规划* 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动态规划法, 起竜息者输入乱 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论