算法设计与分析实验报告Word文件下载.docx
《算法设计与分析实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
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'
;
盘子移动情况如下:
hanoi(n,x,y,z);
}
实验结果:
实验2:
杨辉三角:
#include<
voidprint(int*row,intn)
{
inti;
for(i=1;
i<
n;
i++)
{
if(row[i]!
=0)
{
printf("
row[i]);
row[i]=0;
//置为初始态,方便保存下一行
}
else
"
}
voidinitia(intnum)
intup_row[20];
intnext_row[20];
inti,j;
for(i=0;
=num*2;
up_row[i]=0;
next_row[i]=0;
up_row[num]=next_row[num]=1;
num;
i++)//控制行
for(j=1;
j<
num+i+1;
j++)
up_row[j]=next_row[j];
//保存当前输出行
print(next_row,num+i+1);
//本行输出的有效数据个数为当前行数
=num+i+1;
j++)//0号位的值保留以便下行计算
next_row[j]=up_row[j-1]+up_row[j+1];
//下一行相应位置的值是上一行相应位置左右值的和
intmain(void)
intnum_row;
确定行数(小于10):
"
num_row);
initia(num_row);
return0;
方法2:
动态规划实现:
#defineMAXH31
unsignedlongnum[MAXH]={0};
inti,j,k;
Inputanumbertosetrow:
num[0]=1;
i=0;
for(k=n-i;
k>
0;
k--)
printf("
for(j=i;
j>
j--)
{
num[j]=num[j]+num[j-1];
%d"
num[j]);
}
%d\n"
1);
实验3:
背包问题:
intc[10][100];
/*对应每种情况的最大价值*/
intknapsack(intm,intn)
inti,j,w[10],p[10];
\n输入每个物品的重量及价值:
=n;
%d,%d"
w[i],&
p[i]);
10;
for(j=0;
100;
c[i][j]=0;
/*初始化数组*/
=m;
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;
输入背包的承重量:
m);
\n输入物品的总个数:
maxvalue=knapsack(m,n);
\n背包能装的最大总价值为%d"
maxvalue);
实验4:
斐波那契数列:
voidmain()
intFibonacci(intn);
intn,i;
longintc=0;
求斐波那契数组:
|0n=0\n"
F(n)={1n=1\n"
|F(n-1)+F(n-2)n>
1\n"
请输入n的值:
i<
i++)
c=Fibonacci(i);
%-10ld"
c);
if(i%5==0)//每输出5个换一行;
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:
归并排序
iostream.h>
int*a=newint[20];
intn=0;
//归并排序,排序结果放到了b[]中
voidMerge(inta[],intb[],intleft,intmid,intright)//此处的right指向数组中左后一个元素的位置
inti=left;
intj=mid+1;
intk=left;
while(i<
=mid&
&
=right)
if(a[i]<
=a[j])b[k++]=a[i++];
elseb[k++]=a[j++];
=mid)b[k++]=a[i++];
while(j<
=right)b[k++]=a[j++];
}//从b[]中又搬到了a[]中
voidCopy(inta[],intb[],intleft,intright)//right同上
for(inti=left;
=right;
a[i]=b[i];
}//划分并排序
voidMergeSort(inta[],intleft,intright)//同上
int*b=newint[right+1];
if(left<
right)
//将当前传经来的数组划分成更小的大小几乎相同的数组
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>
>
Array'
selemants:
endl;
for(inti=0;
a[i];
//调用算法
MergeSort(a,0,n-1);
}voidOutput()
a[i]<
}voidmain()
Input();
Output();
实验6:
二分查找:
intsearch(inta[],ints,intr,intkey)
intlow=s,high=r,mid;
if(s<
=r)
mid=(high+low)/2;
if(a[mid]==key)
returnmid;
if(a[mid]<
key)
returnsearch(a,mid+1,high,key);
if(a[mid]>
returnsearch(a,low,mid-1,key);
return-1;
intmain()
intn,a[10000],key,k,i;
请输入数组大小:
while(scanf("
n)!
=EOF)
for(i=0;
i++)
scanf("
a[i]);
printf("
请输入要查找的数:
scanf("
key);
k=search(a,0,n-1,key);
if(k==-1)
NO\n未找到!
YES\n"
该数位置在第%d位!
k+1);