算法分析与设计实验报告.docx
- 文档编号:8237836
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:11
- 大小:209.46KB
算法分析与设计实验报告.docx
《算法分析与设计实验报告.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
算法分析与设计实验报告
安徽工业大学
专业:
班级:
姓名:
学号:
实验一:
回溯法完成0-1背包问题
代码如下:
#include"stdafx.h"
#include
#include
#include
#include
usingnamespacestd;
template
classKnap
{
public:
friendvoidInit();
friendvoidKnapsack();
friendvoidBacktrack(inti);
friendfloatBound(inti);
booloperator<(Knap
{
if(fl elsereturnfalse; } private: tyw;//重量 tyv;//价值 floatfl;//单位重量的价值v/w intkk;//记录第几个物品 intflag;//记录是否放入包中 }; template voidSort(Knap { inti,j,k;Knap for(i=1;i { minl=li[0];k=0; for(j=1;j<=n-i;j++) { if(minl { minl=li[j];swap(li[j],li[k]);k=j; } } } } namespacejie//命名空间 { intc=0,n=0; int*x=NULL; Knap intcp=0,cw=0; intbestp=0; } usingnamespacejie; voidInit() { inti=0; cout< cout<<"请输入物品数量n="; cin>>n;cout< cout<<"请输入背包容量C="; cin>>c;cout< bag=newKnap x=newint[n]; cout<<"请依次输入"< "< for(i=0;i cin>>bag[i].w; cout< cout<<"请依次输入"< "< for(i=0;i cin>>bag[i].v; for(i=0;i { bag[i].flag=0;bag[i].kk=i; bag[i].fl=1.0*bag[i].v/bag[i].w; } } voidBacktrack(inti) { if(i>=n)//到达叶节点 { bestp=cp;//更新最优价值 return; } if(cw+bag[i].w<=c)//进入左子树 { bag[i].flag=1;cw+=bag[i].w; cp+=bag[i].v;Backtrack(i+1); cw-=bag[i].w;cp-=bag[i].v; } if(Bound(i+1)>bestp)//进入右子树 { bag[i].flag=0;Backtrack(i+1); } } //计算当前节点处的上界 floatBound(inti) { intcleft=c-cw;//剩余容量 floatb=cp; while(i { //以物品单位重量价值递减序装入 cleft-=bag[i].w; b+=bag[i].v; i++; } //装满背包 if(i returnb; } voidKnapsack()//计算最优解和变量值 { intL(0);//用L累计价值,初始价值设置为0 for(intk=0;k { x[bag[k].kk]=bag[k].flag;//x=0表示未放入背包,x=1表示放入背包 L+=bag[k].flag*bag[k].v;//价值累加 } cout< cout<<"当前最优价值为: "< cout<<"变量值x="; for(inti=1;i<=n;i++) { cout< } delete[]bag;bag=NULL; delete[]x;x=NULL; cout< } intmain() { cout< cout<<"|**********回溯法解0-1背包问题**********|"< Init(); Backtrack(0); Knapsack(); return0; } 运行结果: 实验二: 分治法实现快速排序 代码如下: #include #include #include voidMergeSort(int*data,intx,inty,int*temp) { intp,q,m,i=x; if(y-x>1) { m=x+(y-x)/2; p=x;q=m; MergeSort(data,x,m,temp); MergeSort(data,m,y,temp); while(p {if(q>=y||(p { temp[i++]=data[p++]; } else {temp[i++]=data[q++]; } } for(i=x;i } } voidHoareSort(int*data,intx,inty) {intp=x,q=y-1,temp; while(p { while(q>p&&data[q]>=data[p])q--; if(q>p) { temp=data[p],data[p]=data[q],data[q]=temp; p++; } while(q>p&&data[p]<=data[q])p++; if(p {temp=data[p],data[p]=data[q],data[q]=temp; q--; } if(p==q) {HoareSort(data,x,p); HoareSort(data,p+1,y); } } } intmain() {intdata[100],i; inttemp[100]; srand(time(NULL)); for(i=0;i<=100;i++) {data[i]=rand()%100; } for(i=0;i<=100;i++) {printf("%d",data[i]); } printf("\n"); HoareSort(data,0,10); for(i=0;i<=100;i++) {printf("%d",data[i]); } printf("\n"); } 运行结果: 实验三: 递归法实现杨辉三角的输出 代码如下: #include"stdio.h" #include"stdlib.h" #include"conio.h" intTry(intn,intk)//递归函数 {if(k==0||k==n)//在左右两侧返回1 return1;//递归出口 returnTry(n-1,k-1)+Try(n-1,k);//返回递归公式 } voidprint_spack(intt,intmode=0)//显示空格函数,这个是杨辉三角格式控制的关键 { if(mode! =0)//当mode不等于0时,代表要输出每行前面的空格,直接循环输出t次空格,并退出函数 { for(inti=0;i { printf(""); } return;//直接返回 }A if(t<10)printf("");//这儿我随意设置的! elseif(t>9&&t<100)printf("");//但是记住规则: 每一行最开始部分的空格减少了k个,那么当t为个位数时输出k+2个空格 elseif(t>99&&t<1000)printf("");//其他t的情况依次递减就行了 elseif(t>999&&t<10000)printf("");//如,我在此设计的每行开头部分减少3个空格,那么t<9时输出5个空格,t>9&&t<100时输出4个空格,其他递减 elseif(t>9999&&t<100000)printf(""); } voidscan(introw)//杨辉三角扫描输出函数 { intt=0; if(row>10)//当行数大于10行时,应该将窗口尺寸该大到150,以保证杨辉三角正常显示,这是一条dos命令,使用system函数推送执行的 { system("modeconcols=150lines=150"); } for(intn=0;n { print_spack(3*(row-n),1);//后面第二个参数传了一个非零参数,是因为告诉函数要直接输出3*(row-n)个空格 for(intm=0;m<=n;m++)//输出中间元素 { printf("%d",t=Try(n,m));//递归调用获得当前第n行,第m个元素的值,输出同时赋值给t print_spack(t);//这儿没有传第二个参数是告诉函数,需要判断t参数的位数来决定输出的空格 } printf("\n");//每行结束后打印一个回车 } } voidmain() { intx=0; while(true) { printf("\n递归实现杨辉三角! \n本程序不能大于20行。 \n请输入杨辉三角的行数: (输入-1结束程序)"); scanf("%d",&x);//输入行数 if(x==-1) { exit(0); } system("cls"); scan(x);//扫描输出 } } 运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告