计算机递归算法分析与设计实验报告级.docx
- 文档编号:29574952
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:20
- 大小:108.61KB
计算机递归算法分析与设计实验报告级.docx
《计算机递归算法分析与设计实验报告级.docx》由会员分享,可在线阅读,更多相关《计算机递归算法分析与设计实验报告级.docx(20页珍藏版)》请在冰豆网上搜索。
计算机递归算法分析与设计实验报告级
算法分析与设计
实
验
报
告
班级:
姓名:
学号:
实验一分治与递归(4学时)
一:
基本递归算法
一、实验目的与要求
1、熟悉C/C++语言的集成开发环境;
2、通过本实验加深对递归过程的理解
二、实验内容:
掌握递归算法的概念和基本思想,分析并掌握“整数划分”问题的递归算法。
三、实验题
任意输入一个整数,输出结果能够用递归方法实现整数的划分。
#include
usingnamespacestd;
intq(intn,intm)
{
if((n<1)||(m<1))return0;
if((n==1)||(m==1))return1;
if(n if(n==m)returnq(n,m-1)+1; returnq(n,m-1)+q(n-m,m); } intmain() { inta,b; cout<<"请输入整数a: "; cin>>a; b=q(a,a); cout<<"整数a的划分多少种: "< return0; } 结果: 二: 二分搜索 一、实验目的与要求 1、熟悉二分搜索算法; 2、初步掌握分治算法; 二、实验题 1、设a[0: n-1]是一个已排好序的数组。 请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最小元素位置j。 当搜索元素在数组中时,I和j相同,均为x在数组中的位置。 实验提示 1、用I,j做参数,且采用传递引用或指针的形式带回值。 boolBinarySearch(inta[],intn,intx,int&i,int&j) { intleft=0; intright=n-1; while(left { intmid=(left+right)/2; if(x==a[mid]) { i=j=mid; returntrue; } if(x>a[mid]) left=mid+1; else right=mid-1; } i=right; j=left; returnfalse; } intSearchTag(inta[],intn,intx) { intleft=0; intright=n-1; while(left { intmid=(left+right)/2; if(x==a[mid])returnmid; if(x>a[mid]) right=mid-1; else left=mid+1; } return-1; } 程序清单 (1)#include usingnamespacestd; intb[80],n; boolBinarySearch(inta[],intn,intx); intmain() { cout<<"请问输入多少个元素? "; cin>>n; cout<<"请输入已排好序的元素集合: "; for(intk=0;k cin>>b[k]; inty; cout<<"请输入要查找的元素: "; cin>>y; BinarySearch(b,n,y); return0; } boolBinarySearch(inta[],intn,intx) { inti,j; intleft=0; intright=n-1; while(left<=right) { intmid=(left+right)/2; if(x==a[mid]) { i=j=mid; cout<<"你查找的元素序号为: "< returntrue; } if(x>a[mid]) left=mid+1; else right=mid-1; } i=right; j=left; cout<<"你查找的元素不存在,小于它的最大元素和大于它的最小元素分别为: "< returnfalse; } 结果 实验二动态规划算法(4学时) 一: 最大子段和问题 一、实验目的与要求 1、熟悉最长最大字段和问题的算法; 2、进一步掌握动态规划算法; 二、实验题 若给定n个整数组成的序列a1,a2,a3,……an,求该序列形如ai+ai+1+……+an的最大值。 实验提示 intMaxSum(intn,int*a,int&besti,int&bestj) { intsum=0; for(inti=1;i<=n;i++) for(intj=i;j<=n;j++) { intthissum=0; for(intK=i;k<=j;k++)thissum+=a[k]; if(thissum>sum) { sum=thissum; besti=i; bestj=j; } } returnsum; } intMaxSum(intn,int*a,int&besti,int&bestj) { intsum=0; for(inti=1;i<=n;i++) { intthissum=0; for(intj=i;j<=n;j++) { thissum+=a[j]; if(thissum>sum) { sum=thissum; besti=i; bestj=j; } } } returnsum; } 程序清单 #include #include #include usingnamespacestd; intmain() { intMaxSum(intn,int*a,int&besti,int&bestj); int*a=newint[50]; intx,n,besti,bestj; cout<<"请输入序列的个数: "; cin>>n; cout<<"请输入整数序列: "; for(inti=0;i { cin>>a[i]; } x=MaxSum(n,a,besti,bestj); cout<<"最大字段和: "<<"起始位置: "< "< 为: "< return0; } intMaxSum(intn,int*a,int&besti,int&bestj) { intsum=0; for(inti=1;i<=n;i++) { intthissum=0; for(intj=i;j<=n;j++) { thissum+=a[j]; if(thissum>sum) { sum=thissum; besti=i; bestj=j; } } } returnsum; } 实验结果 实验三贪心算法(4学时) 一: 用贪心算法求解最小生成树 一、实验要求与目的 1、熟悉贪心算法的基本原理与适用范围。 2、使用贪心算法编程,求解最小生成树问题。 二、实验内容 1、任选一种贪心算法(Prim或Kruskal),求解最小生成树。 对算法进行描述和复杂性分析。 编程实现,并给出测试实例 #include #include //图中顶点个数 #defineV5 //未在mstSet中的点的集合中,找出最小intminKey(intkey[],boolmstSet[]){ key的点 intmin=INT_MAX,min_index; for(intv=0;v if(mstSet[v]==false&&key[v] min=key[v],min_index=v; returnmin_index; } //打印MST intprintMST(intparent[],intn,intgraph[V][V]) { printf("EdgeWeight\n"); for(inti=1;i printf("%d-%d%d\n",parent[i],i,graph[i][parent[i]]);return0; } //Prim算法 voidprimMST(intgraph[V][V]) { intparent[V];// intkey[V]; //保持MST信息 //所有顶点的代价值 boolmstSet[V];//当前包含在MST中点的集合 //初始为无穷大 for(inti=0;i key[i]=INT_MAX,mstSet[i]=false; key[0]=0; //parent[0]=-1;//第一个作为树的根。 //MST有V的顶点 for(intcount=0;count { intu=minKey(key,mstSet); //添加u到MSTSet mstSet[u]=true; //更新和u相连的顶点的代价 for(intv=0;v if(graph[u][v]&&mstSet[v]==false&&graph[u][v]< parent[v]=u,key[v]=graph[u][v]; key[v]) } //打印生成的MSTprintMST(parent,V,graph); } intmain() { /*创建以下的图 23 (0)-- (1)-- (2) |/\| 6|8/\5|7 |/\| (3)-------(4) 9*/ intgraph[V][V]={{0,2,0,6,0}, {2,0,3,8,5}, {0,3,0,0,7}, {6,8,0,0,9}, {0,5,7,9,0}, }; //PrintthesolutionprimMST(graph); return0; } 运行结果: 实验四回溯算法(4学时) 一: 0—1背包问题 一、实验目的与要求 1、掌握0—1背包问题的回溯算法; 2、掌握回溯算法; 二、实验题: 给定n种物品和一背包。 物品i的重量是wi,其价值为vi,背包的容量为C。 问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 实验提示 template TypepKnap : Bound(inti) {//计算上界 Typewcleft=c-cw;//剩余容量 Typepb=cp; //以物品单位重量价值递减序装入物品 while(i<=n&&w[i]<=cleft){ cleft-=w[i]; b+=p[i]; i++; } //装满背包 if(i<=n)b+=p[i]/w[i]*cleft; returnb; } 程序清单 #include usingnamespacestd; classKnap { friendintKnapsack(intp[],intw[],intc,intn); public: voidprint() { for(intm=1;m<=n;m++) { cout< } cout< }; private: intBound(inti); voidBacktrack(inti); intc;//背包容量 intn;//物品数 int*w;//物品重量数组 int*p;//物品价值数组 intcw;//当前重量 intcp;//当前价值 intbestp;//当前最优值 int*bestx;//当前最优解 int*x;//当前解 }; intKnap: : Bound(inti) { //计算上界 intcleft=c-cw;//剩余容量 intb=cp; //以物品单位重量价值递减序装入物品 while(i<=n&&w[i]<=cleft) { cleft-=w[i]; b+=p[i]; i++; } //装满背包 if(i<=n) b+=p[i]/w[i]*cleft; returnb; } voidKnap: : Backtrack(inti) { if(i>n) { if(bestp { for(intj=1;j<=n;j++) bestx[j]=x[j]; bestp=cp; } return; } if(cw+w[i]<=c)//搜索左子树 { x[i]=1; cw+=w[i]; cp+=p[i]; Backtrack(i+1); cw-=w[i]; cp-=p[i]; } if(Bound(i+1)>bestp)//搜索右子树 { x[i]=0; Backtrack(i+1); } } classObject { friendintKnapsack(intp[],intw[],intc,intn); public: intoperator<=(Objecta)const { return(d>=a.d); } private: intID; floatd; }; intKnapsack(intp[],intw[],intc,intn) { //为Knap: : Backtrack初始化 intW=0; intP=0; inti=1; Object*Q=newObject[n]; for(i=1;i<=n;i++) { Q[i-1].ID=i; Q[i-1].d=1.0*p[i]/w[i]; P+=p[i]; W+=w[i]; } if(W<=c) returnP;//装入所有物品 //依物品单位重量排序 floatf; for(i=0;i for(intj=i;j { if(Q[i].d { f=Q[i].d; Q[i].d=Q[j].d; Q[j].d=f; } } KnapK; K.p=newint[n+1]; K.w=newint[n+1]; K.x=newint[n+1]; K.bestx=newint[n+1]; K.x[0]=0; K.bestx[0]=0; for(i=1;i<=n;i++) { K.p[i]=p[Q[i-1].ID]; K.w[i]=w[Q[i-1].ID]; } K.cp=0; K.cw=0; K.c=c; K.n=n; K.bestp=0; //回溯搜索 K.Backtrack (1); K.print(); delete[]Q; delete[]K.w; delete[]K.p; returnK.bestp; } voidmain() { int*p; int*w; intc=0; intn=0; inti=0; cout<<"请输入背包个数: "< cin>>n; p=newint[n+1]; w=newint[n+1]; p[0]=0; w[0]=0; cout<<"请输入每个背包的价值: "< for(i=1;i<=n;i++) cin>>p[i]; cout<<"请输入每个背包的重量: "< for(i=1;i<=n;i++) cin>>w[i]; cout<<"请输入背包容量: "< cin>>c; cout< } 五、实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 递归 算法 分析 设计 实验 报告