数据结构与算法分析专题实验西安交大赵仲孟.docx
- 文档编号:23315464
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:35
- 大小:122.38KB
数据结构与算法分析专题实验西安交大赵仲孟.docx
《数据结构与算法分析专题实验西安交大赵仲孟.docx》由会员分享,可在线阅读,更多相关《数据结构与算法分析专题实验西安交大赵仲孟.docx(35页珍藏版)》请在冰豆网上搜索。
数据结构与算法分析专题实验西安交大赵仲孟
西安交通大学
数据结构与算法课程实验
实验名称:
数据结构与算法课程专题实验
所属学院:
电信学院
专业班级:
计算机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:
#include"iostream"
usingnamespacestd;
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;i s=s+a[i]; returns; } voidprint(){ for(inti=0;i cout< cout< } }; voidpanduan(intx1,intn,intx2[],LStack*x4){ inti,ss=0; for(i=x4->pop()+1;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<<"输入物品个数"< cin>>n; cout<<"输入物品大小"< for(inti=0;i cin>>m[i]; cout<<"输入背包大小"< cin>>z; ll->push(-1,0); cout<<"符合条件的解"< panduan(z,n,m,ll); return0; } 结果1: 代码2: #include #include usingnamespacestd; structBag { intV;//背包体积 intnumber;//物品数量 intv[20];//物品体积 intvalue[20];//物品价值 intdp[20][20];//最大价值 }bag; intmax(inta,intb) { returna>b? a: b; } intmain() { cout<<"请输入背包的容量: "< cin>>bag.V; cout<<"请输入物品的数量: "< cin>>bag.number; cout<<"请输入每件物品的体积: "< for(inti=1;i<=bag.number;i++) { cin>>bag.v[i]; } cout<<"请输入每件物品的价值: "< for(inti=1;i<=bag.number;i++) { cin>>bag.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]); else bag.dp[i][j]=bag.dp[i-1][j]; } cout<<"最大价值: "< return0; } 结果2: 熟悉了堆栈的使用,设用数组weight[1..N]存放物品重量,MaxW表示背包的最大装载量。 每进栈一个物品,就从sum中减去该物品的质量,设i为待选物品序号,若 sum-weight[i]>=0,则该物品可选;若sum-weight[i] < 0,则该物品不可选,且若i>n,则需退栈,若此时栈空,则说明无解。 实验二二叉排序树的实现 1.问题描述 分别采用二叉链表和顺序表作存储结构,实现对二叉排序树的操作。 2.基本要求(选择其中之一方式实现) (1)用二叉链表作存储结构实现二叉排序树。 (2)以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T; (3)对二叉排序树T作中序遍历,输出结果; (4)计算二叉排序树T查找成功的平均查找长度,输出结果; (5)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则,输出信息“无x”; 3.问题分析 可以再二叉树建立时记录每个节点移动到正确位置所需要的移动步数,再用总的移动步数除以总的节点数就是平均查找步数。 4.算法实现 代码: #include"iostream" #include"math.h" #include"string.h" #include"stdlib.h" usingnamespacestd; 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--; } else cout<<"无"< } voidprint(){ if(root==NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 分析 专题 实验 西安 交大 赵仲孟