算法分析与设计实验报告河北工业大学.docx
- 文档编号:12698282
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:18
- 大小:127.52KB
算法分析与设计实验报告河北工业大学.docx
《算法分析与设计实验报告河北工业大学.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告河北工业大学.docx(18页珍藏版)》请在冰豆网上搜索。
算法分析与设计实验报告河北工业大学
《算法分析与设计》实验报告
实验一算法实现一
一、实验目的与要求
熟悉C/C++语言的集成开发环境;
通过本实验加深对分治法、贪心算法的理解。
二、实验内容:
掌握分治法、贪心算法的概念和基本思想。
三、实验题
1.【伪造硬币问题】给你一个装有n个硬币的袋子。
n个硬币中有一个是伪造的。
你的任务是找出这个伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。
给出一种找零钱的贪心算法。
四、实验步骤
理解算法思想和问题要求;
编程实现题目要求;
上机输入和调试自己所编的程序;
验证分析实验结果;
五、实验程序
1.【伪造硬币问题】
#include
intcompare(int*coin,intastart,intbstart,intn)
{intasum=0;
intbsum=0;
inti;
for(i=astart;i asum+=coin[i]; for(i=bstart;i bsum+=coin[i]; if(asum if(asum==bsum)return0; if(asum>bsum)return1; } intfind(int*coin,intstart,intn) {if(n==1) {printf("第%d个是假币",start+1); returnstart;} if((n%2)==0) {if(compare(coin,start,n/2,n/2)==-1)find(coin,start,n/2); elsefind(coin,n/2,n/2); } else {if(compare(coin,start,start+(n-1)/2,(n-1)/2)==-1)find(coin,start,(n-1)/2); else if(compare(coin,start,start+(n-1)/2,(n-1)/2)==0)find(coin,start+n-1,1); elsefind(coin,start+(n-1)/2,(n-1)/2); } } voidmain() {inta[10]={1,1,0,1,1,1,1,1,1,1}; intN=10; printf("%d",find(a,0,N)+1); scanf("%d/n",N); } 2.【找零钱问题】 #include intcoin25=0; intcoin10=0; intcoin5=0; intcoin1=0; voidtanxin(inttz) { inta=tz; if(tz>=25) { tz=tz%25; a=a/25; coin25+=a; } if(tz>=10) { a=tz; tz=tz%10; a=a/10; coin10+=a; } if(tz>=5) { a=tz; tz=tz%5; a=a/5; coin5+=a; } if(tz>=1) { a=tz; tz=tz%1; a=a/1; coin1+=a; } } voidmain() { intz;intf;ints; printf("请输入应付金额\n"); scanf("%d",&f); printf("请输入收款金额\n"); scanf("%d",&s); z=s-f; tanxin(z); printf("25美分%d\n",coin25); printf("10美分%d\n",coin10); printf("5美分%d\n",coin5); printf("1美分%d\n",coin1); printf("共需要硬币括%d\n",coin25+coin10+coin5+coin1); scanf("%d",&s); } 六、实验结果 1.【伪造硬币问题】 2.【找零钱问题】 实验二算法实现二 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对贪心算法、动态规划和回溯算法的理解。 二、实验内容: 掌握贪心算法、动态规划和回溯算法的概念和基本思想,分析并掌握"0-1"背包问题的三种算法,并分析其优缺点。 三、实验题 1."0-1"背包问题的贪心算法 2."0-1"背包问题的动态规划算法 3."0-1"背包问题的回溯算法 四、实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 五、实验程序 1."0-1"背包问题的贪心算法 #include #include usingnamespacestd; structgood{//货物数据结构 doublep; doublew; doubler; }a[200]; doubles,value,m,result; inti,n; boolbigger(gooda,goodb) {returna.r>b.r; } intmain() {printf("输入物品个数: "); scanf("%d",&n);//物品个数 printf("输入物品的重量和价值: "); for(i=0;i {scanf("%lf%lf",&a[i].w,&a[i].p); a[i].r=a[i].p/a[i].w; } sort(a,a+n,bigger);//调用sort排序函数 printf("输入背包的容量;"); scanf("%lf",&m); s=0; value=0; result=0; for(i=0;i {value+=a[i].p; s+=a[i].w;} result=value*s; printf("背包内物品总价值为: %.2lf.\n",result); return0; } 2."0-1"背包问题的动态规划算法 #include #include #include #include usingnamespacestd; voidKnapsack(vector voidprint(vector voidprintarr(vector voidTraceback(vector voidmain() {intmo=10; vector vector intc,n,v,w; cout<<"***0-1背包问题动态规划***"< cout<<"***请输入物品数y***"< cin>>n; srand((unsigned)time(NULL)); vct_w.push_back(n); for(inti=1;i<=n;i++) {w=rand()%mo+1; vct_w.push_back(w); } vct_v.push_back(n); for(inti=1;i<=n;i++) {v=rand()%mo+10; vct_v.push_back(v); } cout<<"***请输入背包容量***"< cin>>c; cout<<"***请物品重量**"< print(vct_w); cout<<"***请输入物品价值**"< print(vct_v); Knapsack(vct_v,vct_w,c,n); } voidprint(vector {for(inti=1;i {cout< } cout< } voidprintarr(vector {for(inti=1;i<=p;i++) {for(intj=1;j<=q;j++) {cout< } cout< } cout< } voidKnapsack(vector {vector intjMax; for(inti=0;i<=n;i++) jMax=vct_w[n]-1 vct_w[n]-1: c; for(intj=0;j<=jMax;j++) m[n][j]=0; for(intj=vct_w[n];j<=c;j++) m[n][j]=vct_v[n]; for(inti=n-1;i>1;i--) {intjMax=vct_w[i]-1 vct_w[i]-1: c; for(intj=0;j<=jMax;j++) m[i][j]=m[i+1][j]; for(intj=vct_w[i];j<=c;j++) m[i][j]=m[i+1][j]>m[i+1][j-vct_w[i]]+vct_v[i]? m[i+1][j]: m[i+1][j-vct_w[i]]+vct_v[i]; } m[1][c]=m[2][c]; if(c>=vct_w[1]) m[1][c]=m[1][c]>m[2][c-vct_w[1]]+vct_v[1]? m[1][c]: m[2][c-vct_w[1]]+vct_v[1]; cout<<"***m列表容***"< printarr(m,n,c); Traceback(m,vct_w,c,n); } voidTraceback(vector {vector x.push_back(0); for(inti=1;i {if(m[i][c]==m[i+1][c]) x.push_back(0); else {x.push_back (1); c-=vct_w[i]; } } x.push_back((m[n][c])>0? 1: 0); cout<<"***动态规划所得的最优解为***"< for(inti=1;i {cout< } cout< } 3."0-1"背包问题的回溯算法 #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; //chark; while(true) {cout<<"请输入背包容量: "< cin>>c; 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<<"最优解为: "< //cout<<"最优值为(bestp): "< cout< cout<<"=========================="< //cout<<"[s]重新开始"< //cout<<"[q]退出"< //cin>>k; }} 六、实验结果 1."0-1"背包问题的贪心算法 2."0-1"背包问题的动态规划算法 3."0-1"背包问题的回溯算法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告 河北 工业大学