数据结构与算法分析专题实验-西安交大-赵仲孟

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

西安交通大学数据结构与算法课程实验实验名称:数据结构与算法课程专题实验所属学院:电信学院专业班级:计算机32班小组成员:指导老师:赵仲孟教授实验一背包问题的求解1.问题描述假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,…wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wm=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)(1,4,5)(8,2)(3,5,2)。2.实现提示可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后,顺序选取物品装入背包,若已选取第i件物品后未满,则继续选取第i+1件,若该件物品“太大”不能装入,则弃之,继续选取下一件,直至背包装满为止。如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入的物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直到求得满足条件的解,或者无解。由于回溯求解的规则是“后进先出”,自然要用到“栈”。3.问题分析1、设计基础后进先出,用到栈结构。2、分析设计课题的要求,要求编程实现以下功能:a.从n件物品中挑选若干件恰好装满背包b.要求找出所有满足上述条件的解,例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2)3,要使物品价值最高,即p1*x1+p2*x1+...+pi*xi(其1=i=n,x取0或1,取1表示选取物品i)取得最大值。在该问题中需要决定x1..xn的值。假设按i=1,2,...,n的次序来确定xi的值。如果置x1=0,则问题转变为相对于其余物品(即物品2,3,.,n),背包容量仍为c的背包问题。若置x1=1,问题就变为关于最大背包容量为c-w1的问题。现设r={c,c-w1}为剩余的背包容量。在第一次决策之后,剩下的问题便是考虑背包容量为r时的决策。不管x1是0或是1,[x2,.,xn]必须是第一次决策之后的一个最优方案。也就是说在此问题中,最优决策序列由最优决策子序列组成。这样就满足了动态规划的程序设计条件。4.问题实现代码1:#includeiostreamusingnamespacestd;classLink{public:intm;Link*next;Link(inta=0,Link*b=NULL){m=a;next=b;}};classLStack{private:Link*top;intsize;inta[100];public:LStack(intsz=0){top=NULL;size=0;a[0]=0;}~LStack(){clear();}voidclear(){while(top!=NULL){Link*temp=top;top=top-next;deletetemp;}size=0;}voidpush(intit,intb){top=newLink(it,top);a[size]=b;size++;}intpop(){intit=top-m;Link*ltemp=top-next;deletetop;top=ltemp;size--;returnit;}inttopValue(){returntop-m;}intlength(){returnsize;}intsum(){ints=0;for(inti=0;isize;i++)s=s+a[i];returns;}voidprint(){for(inti=0;isize;i++)couta[i];coutendl;}};voidpanduan(intx1,intn,intx2[],LStack*x4){inti,ss=0;for(i=x4-pop()+1;in;i++){if(x4-sum()+x2[i]=x1){x4-push(i,x2[i]);}if(x4-sum()==x1){x4-print();break;}}if(x4-length()==1&&x4-topValue()==n-1)return;elsepanduan(x1,n,x2,x4);}intmain(){LStack*ll=newLStack(0);intm[100];intn,z;cout输入物品个数endl;cinn;cout输入物品大小endl;for(inti=0;in;i++)cinm[i];cout输入背包大小endl;cinz;ll-push(-1,0);cout符合条件的解endl;panduan(z,n,m,ll);return0;}结果1:代码2:#includeiostream#includecstringusingnamespacestd;structBag{intV;//背包体积intnumber;//物品数量intv[20];//物品体积intvalue[20];//物品价值intdp[20][20];//最大价值}bag;intmax(inta,intb){returnab?a:b;}intmain(){cout请输入背包的容量:endl;cinbag.V;cout请输入物品的数量:endl;cinbag.number;cout请输入每件物品的体积:endl;for(inti=1;i=bag.number;i++){cinbag.v[i];}cout请输入每件物品的价值:endl;for(inti=1;i=bag.number;i++){cinbag.value[i];}memset(bag.dp,0,sizeof(bag.dp));//dp中的每一个元素置零for(inti=1;i=bag.number;i++)for(intj=0;j=bag.V;j++){if(j=bag.v[i])bag.dp[i][j]=max(bag.dp[i-1][j],bag.dp[i-1][j-bag.v[i]]+bag.value[i]);elsebag.dp[i][j]=bag.dp[i-1][j];}cout最大价值:bag.dp[bag.number][bag.V]endl;return0;}结果2:熟悉了堆栈的使用,设用数组weight[1..N]存放物品重量,MaxW表示背包的最大装载量。每进栈一个物品,就从sum中减去该物品的质量,设i为待选物品序号,若sum-weight[i]=0,则该物品可选;若sum-weight[i]0,则该物品不可选,且若in,则需退栈,若此时栈空,则说明无解。实验二二叉排序树的实现1.问题描述分别采用二叉链表和顺序表作存储结构,实现对二叉排序树的操作。2.基本要求(选择其中之一方式实现)(1)用二叉链表作存储结构实现二叉排序树。(2)以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;(3)对二叉排序树T作中序遍历,输出结果;(4)计算二叉排序树T查找成功的平均查找长度,输出结果;(5)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则,输出信息“无x”;3.问题分析可以再二叉树建立时记录每个节点移动到正确位置所需要的移动步数,再用总的移动步数除以总的节点数就是平均查找步数。4.算法实现代码:#includeiostream#includemath.h#includestring.h#includestdlib.husingnamespacestd;classBSTNode{public:doubleit;BSTNode*lc;BSTNode*rc;BSTNode(){lc=rc=NULL;}BSTNode(doublea,BSTNode*l=NULL,BSTNode*r=NULL){it=a;lc=l;rc=r;}~BSTNode(){}doublegetele(){returnit;}voidsetele(doublea){it=a;}inlineBSTNode*getlc(){returnlc;}inlineBSTNode*getrc(){returnrc;}inlinevoidsetlc(BSTNode*a){lc=a;}inlinevoidsetrc(BSTNode*a){rc=a;}boolisleaf(){return(lc==NULL&&rc==NULL);}};classBST{friendclassBSTNode;private:BSTNode*root;intnodecount;intcd;voidclearhelp(BSTNode*);boolfindhelp(BSTNode*,double);BSTNode*getmin(BSTNode*);BSTNode*deletemin(BSTNode*);BSTNode*insethelp(BSTNode*,double);BSTNode*removehelp(BSTNode*,double);voidprinthelp(BSTNode*,int);public:BST(){root=NULL;nodecount=0;cd=0;}~BST(){clearhelp(root);}voidclear(){clearhelp(root);nodecount=0;}voidinset(doublea){root=insethelp(root,a);}doubleremove(doublea){if(findhelp(root,a)){root=removehelp(root,a);nodecount--;cd--;}elsecout无aendl;}voidprint(){if(root==NULL)coutTreeisemptyendl;elseprinthelp(root,0);}voidchazhaochangdu(){inta;a=cd/nodecount;coutaendl;}};boolBST::findhelp(BSTNode*root,doublea){if(root==NULL)returnfalse;if(aroot-it)returnfindhelp(root-lc,a);elseif(aroot-it)returnfindhelp(root-rc,a);elseif(a==root-it)returntrue;}BSTNode*BST::insethelp(BSTNode*root,doublea){if(root==NULL){cd++;nodecount++;returnnewBSTNode(a,NULL,NULL);}if(a=root-it){cd++;root-setlc(insethelp(root-lc,a));}elseif(aroot-it){cd++;root-setrc(insethelp(root-rc,a));}returnroot;}BSTNode*BST::deletemin(BSTNode*rt){if(rt-lc==NULL)returnrt-rc;else{rt-setlc(deletemin(rt-lc));returnrt;}}BSTNode*BST::getmin(BSTNode*rt){if(rt-lc==NULL)returnrt;elsereturngetmin(rt-lc);}BSTNode*BST::removehelp(BSTNode*rt,doublea){if(rt==NULL)returnNULL;elseif(art-it)rt-setlc(removehelp(rt-lc,a));elseif(art-it)rt-setr

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功