0-1背包问题的分支限界法源代码_第1页
0-1背包问题的分支限界法源代码_第2页
0-1背包问题的分支限界法源代码_第3页
0-1背包问题的分支限界法源代码_第4页
0-1背包问题的分支限界法源代码_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、/#includestdafx.h#include#include#include#includeusingnamespacestd;int*x;structnode结点表结点数据结构(node.parent;父结点指针node*next;后继结点指针intlevel;结点的层intbag;节点的解intcw;当前背包装载量intcp;当前背包价值floatub;结点的上界值;类Kn叩中的数据记录解空间树中的结点信息,以减少参数传递及递归调用所需的栈空间classKnap(private:structnode*front,队列队首*bestp,*first;解结点、根结点int*p,*w,n,

2、c,*M;背包价值、重量、物品数、背包容量、记录大小顺序关系longIbestp;背包容量最优解public:voidSort();Knap(int*pp,int*ww,intccjntnn);Knap();floatBound(intijntcwjntcp);计算上界限node*nnoder(node*pa,intbajloatuub);生成一个结点ba=l生成左节点ba=0生成右节点voidaddnode(node*nod);向队列中添加活结点voiddeletenode(node*nod);将结点从队列中删除structnode*nextnode();/取下一个节点voiddisplay

3、。;输出结果voidsolvebag();背包问题求解);按物品单位重量的价值排序voidKnap:Sort()intijkkkl;floatmini;for(i=l;in;i+)minl=1.0*pi/wi;k=0;for(j=l;j=n-i;j+)if(minl1.0*pj/wj)minl=1.0*pj/wj;swap(pk/pj);swap(wk,wj);swap(Mk,Mj);k=j;)Knap:Knap(int*pp,int*ww,intccjntnn)(inti;n=nn;c=cc;p=newintn;w=newintn;M=newintn;for(i=0;inext=NULL;l

4、bestp=0;bestp=newnodel;bestp=NULL;Sort();)Knap:Knap()deletefront;deletebestp;deletep;deletew;)取上限最大结点node*Knap:nextnode()(node*p=front-next;front-next=p-next;return(p);将一个新的结点插入到子集树和优先队列中node*Knap:nnoder(structnode*pa,intba,floatuub)生成一个新结点node*nodell=new(node);nodell-parent=pa;nodell-next=NULL;node

5、ll-level=(pa-level)+l;nodell-bag=ba;nodell-ub=uub;if(ba=l)nodell-cw=pa-cw+wpa-level;nodell-cp=pa-cp+ppa-level;elsenodell-cw=pa-cw;nodell-cp=pa-cp;return(nodell);将结点加入优先队列voidKnap:addnode(node*no)node*p=front-next/nextl=front;floatub=no-ub;while(p!=NULL)if(p-ubnext=p;nextl-next=no;break;nextl=p;p=p-n

6、ext;if(p=NULL)nextl-next=no;)/计算结点所相应价值的上界floatKnap:Bound(intijntcvintcp)(intcleft=c-cw;剩余容量floatb=(float)cp;价值上界以物品单位重量价值减序装填剩余容量while(in&wi=cleft)cleft-=wi;b+=pi;i+;)装填剩余容量装满背包if(in)b+=1.0*pi/wi*cleft;returnb;)计算最优值和变量值voidKnap:display()(inti;coutendl;coutcv当前最优价值为:=l;i-)xMi-l=bestp-bag;bestp=best

7、p-parent;cout变量值x=H;for(i=l;iparent=NULL;first-next=NULL;first-level=O;用level记录结点的层first-cw=0;first-cp=O;first-bag=O;ubb=Bound(0,0,0);first-ub=ubb;front-next=first;while(front-next!=NULL)aa=nextnode();i=aa-level;当叶子节点处的解最优解时,更新最优解if(i=n-l)if(aa-cw+wicp+pi)lbestp)lbestp=aa-cp+pi;bestp=nnoder(aa,l,(fl

8、oat)lbestp);将一个新的结点插入到子集树和优先队列中)if(long)(aa-cp)lbestp)lbestp=aa-cp;bestp=nnoder(aa,0,(float)lbestp);)非叶子结点,递归调用Bound函数计算上界if(aa-cw+wicw+wi,aa-cp+pi)(float)lbestp)ubb=Bound(i/aa-cw+wi/aa-cp+pi);addnode(nnoder(aa,l,ubb);将结点加入到优先队列中)ubb=ubb=Bound(i,aa-cw,aa-cp);if(ubblbestp)addnode(nnoder(aa,0,ubb);)display();)intmain()(intczn;inti=O;int*p;int*w;coutendl;coukv*11c分支限界法解0-1背包问题*”endl;coutendl;cout“请输入物品数量n=;cinn;coutendl;cout”请输入背包容量C=;cinc;coutendl;x=newintn;变量值p=newintn;物品价值w=newintn;物品重量8ut请分别输入这个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论