- 19
- 0
- 约9.7千字
- 约 30页
- 2018-03-04 发布于浙江
- 举报
[计算机软件及应用]算法实验报告
算法分析与设计
实验报告
班级:####
学号:####
姓名:####
实验一 算法实现一
实验目的与要求
熟悉C/C++语言的集成开发环境;
通过本实验加深对分治法、贪心算法的理解。
实验内容:
掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
实验题
1. 【伪造硬币问题】给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
(1) 源程序:
#includeiostream.h
#includestdlib.h
#includetime.h
int findTheCoin(int q[],int a,int b);
int quantity(int q[],int a,int b);
void main()
{
time_t ts;
srand((unsigned) time(ts));
const int Max=70;
int n,k;
while(true)
{
cout 请输入硬币的个数 endl;
cin n;
int q[Max];
int i;
for( i=1;i=n;i++)
{
q[i]=2;
}
k=rand()%n;
if(k==0)
k=n;
q[k]=1;
cout随机产生的硬币排列顺序endl;
for(i=1;i=n;i++)
{
coutq[i] ;
if(i%5==0)
coutendl;
}
coutendl;
int p=findTheCoin(q,1,n);
cout伪造硬币的位置:pendl;
cout=======================endl;
}
}
int quantity(int q[],int a,int b)
{
int total=0;
int i;
for( i=a;i=b;i++)
total+=q[i];
return total;
}
int findTheCoin(int q[],int a,int b)
{
if(a==b)
return a;
int n=b-a+1;
int c=n%3;
int m=a+n/3-1;
int d;
switch(c)
{
case 0:
if (quantity(q,a,m)==quantity(q,m+1,m+n/3))
{
d=findTheCoin(q,m+n/3+1,m+2*(n/3));
return d;
}
else if (quantity(q,a,m)==quantity(q,m+n/3+1,m+2*(n/3)))
{
d=findTheCoin(q,m+1,m+n/3);
return d;
}
else
{
d=findTheCoin(q,a,m);
return d;
}
//break;
case 1:
if( (quantity(q,a,m)==quantity(q,m+1,m+n/3)) (quantity(q,m+n/3+1,m+2*(n/3))==quantity(q,m+1,m+n/3)) )
return m+2*(n/3)+1;
else
{
if (quantity(q,a,m)==quantity(q,m+1,m+n/3))
{
d=findTheCoin(q,m+n/3+1,m+2*(n/3));
return d;
}
else if (quantity(q,a,m)==quantity(q,m+n/3+1,m+2*(n/3)))
{
d=findTheCoin(q,m+1,m+n/3);
return d;
}
else
{
d=findTheCoin(q,a,m);
return d;
}
}
//break;
case 2:
if(q[m+2*(n/3)+1]==q[m+2*(n/3)+2])
{
if (quantity(q,a,m)==quantity(q,m+1,m+n/3))
{
d=findTheCoin(q,m+n/3+1,m+2*(n/3));
return d;
}
els
原创力文档

文档评论(0)