算法设计与分析实验报告.docx
- 文档编号:7326003
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:13
- 大小:236.56KB
算法设计与分析实验报告.docx
《算法设计与分析实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
算法设计与分析实验报告
算法设计与程序分析
实验报告
姓名:
学号:
班级:
指导老师:
实验1:
汉诺塔问题
程序代码:
#include
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
inti=1;//记录步数
voidmove(intn,charfrom,charto)//将编号为n的盘子由from移动到to
{printf("第%d步:
将%d号盘子%c---->%c\n",i++,n,from,to);
}
voidhanoi(intn,charfrom,chardenpend_on,charto)//将n个盘子由初始塔移动到目标塔(利用借用塔)
{
if(n==1)
move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else
{
hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n,from,to);//将剩下的一个盘子移动到目的塔上
hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
voidmain()
{
printf("请输入盘子的个数:
\n");
intn;
scanf("%d",&n);
charx='A',y='B',z='C';
printf("盘子移动情况如下:
\n");
hanoi(n,x,y,z);
}
实验结果:
实验2:
杨辉三角:
程序代码:
#include
voidprint(int*row,intn)
{
inti;
for(i=1;i { if(row[i]! =0) { printf("%d",row[i]); row[i]=0;//置为初始态,方便保存下一行 } else printf(""); } printf("\n"); } voidinitia(intnum) { intup_row[20]; intnext_row[20]; inti,j; for(i=0;i<=num*2;i++) { up_row[i]=0; next_row[i]=0; } up_row[num]=next_row[num]=1; for(i=0;i { for(j=1;j { up_row[j]=next_row[j];//保存当前输出行 } print(next_row,num+i+1);//本行输出的有效数据个数为当前行数 for(j=1;j<=num+i+1;j++)//0号位的值保留以便下行计算 { next_row[j]=up_row[j-1]+up_row[j+1];//下一行相应位置的值是上一行相应位置左右值的和 } } } intmain(void) { intnum_row; printf("确定行数(小于10): "); scanf("%d",&num_row); initia(num_row); return0; } 实验结果: 方法2: 动态规划实现: 程序代码: #include #defineMAXH31 intmain(void) { unsignedlongnum[MAXH]={0}; inti,j,k; intn; printf("Inputanumbertosetrow: "); scanf("%d",&n); num[0]=1; i=0; for(i=0;i { for(k=n-i;k>0;k--) printf(""); for(j=i;j>0;j--) { num[j]=num[j]+num[j-1]; printf("%d",num[j]); } printf("%d\n",1); } return0; } 实验3: 背包问题: 程序代码: #include intc[10][100];/*对应每种情况的最大价值*/ intknapsack(intm,intn) { inti,j,w[10],p[10]; printf("\n输入每个物品的重量及价值: \n"); for(i=1;i<=n;i++) scanf("%d,%d",&w[i],&p[i]); for(i=0;i<10;i++) for(j=0;j<100;j++) c[i][j]=0;/*初始化数组*/ for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(w[i]<=j)/*如果当前物品的容量小于背包容量*/ { if(p[i]+c[i-1][j-w[i]]>c[i-1][j]) /*如果本物品的价值加上背包剩下的空间能放的物品的价值*/ /*大于上一次选择的最佳方案则更新c[i][j]*/ c[i][j]=p[i]+c[i-1][j-w[i]]; else c[i][j]=c[i-1][j]; } elsec[i][j]=c[i-1][j]; } return(c[n][m]); } intmain() { intm,n; intmaxvalue; printf("输入背包的承重量: "); scanf("%d",&m); printf("\n输入物品的总个数: "); scanf("%d",&n); maxvalue=knapsack(m,n); printf("\n背包能装的最大总价值为%d",maxvalue); printf("\n"); return0; } 实验结果: 实验4: 斐波那契数列: 程序代码: #include voidmain() { intFibonacci(intn); intn,i; longintc=0; printf("求斐波那契数组: \n"); printf("|0n=0\n"); printf("F(n)={1n=1\n"); printf("|F(n-1)+F(n-2)n>1\n"); printf("请输入n的值: "); scanf("%d",&n); for(i=1;i<=n;i++) { c=Fibonacci(i); printf("%-10ld",c); if(i%5==0)//每输出5个换一行; printf("\n"); } printf("\n"); } intFibonacci(intn)//函数部分; { longintfib; if(n==0) { fib=0; } elseif(n==1||n==2) { fib=1; } elseif(n>=3) { fib=Fibonacci(n-1)+Fibonacci(n-2); } returnfib; } 实验结果: 实验5: 归并排序 程序代码: #include int*a=newint[20]; intn=0; //归并排序,排序结果放到了b[]中 voidMerge(inta[],intb[],intleft,intmid,intright)//此处的right指向数组中左后一个元素的位置 { inti=left; intj=mid+1; intk=left; while(i<=mid&&j<=right) { if(a[i]<=a[j])b[k++]=a[i++]; elseb[k++]=a[j++]; } while(i<=mid)b[k++]=a[i++]; while(j<=right)b[k++]=a[j++]; }//从b[]中又搬到了a[]中 voidCopy(inta[],intb[],intleft,intright)//right同上 { for(inti=left;i<=right;i++) a[i]=b[i]; }//划分并排序 voidMergeSort(inta[],intleft,intright)//同上 { int*b=newint[right+1]; if(left { //将当前传经来的数组划分成更小的大小几乎相同的数组 inti=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); //将小数组合成大数组,同时排序,结果放到b[]中 Merge(a,b,left,i,right); //从b[]中挪到a[]中 Copy(a,b,left,right); } }voidInput() { cout<<"PleaseInputarray'ssize: "; cin>>n; cout<<"Array'selemants: "< for(inti=0;i cin>>a[i]; //调用算法 MergeSort(a,0,n-1); }voidOutput() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 报告