算法分析与设计实验报告 完整版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法分析与设计》课程实验
实验报告
专业:计算机科学与技术
班级:
姓名:
学号:
完成时间:2009年6月15日
实验一算法实现一
一、实验目的与要求
熟悉C/C++语言的集成开发环境;
通过本实验加深对分治法、贪心算法的理解。
二、实验内容:
掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
三、实验题
1. 【伪造硬币问题】给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的
任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。售
货员希望用数目最少的硬币找给小孩。假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。给出一种找零钱的贪心算法。
四、实验步骤
理解算法思想和问题要求;
编程实现题目要求;
上机输入和调试自己所编的程序;
验证分析实验结果;
整理出实验报告。
五、实验程序
1.伪造硬币问题
源程序:
//c语言实现
#include
#include
#include
#define N 100
#define N1 12
//只能判断是否相等的天平
void solve(int coin[],int count,int first,int last) {
if (count==2) {
printf("无法判断\n");
return;
}
if (first==last) {//只有一个硬币时候
printf("假币的序号为%d, 假币的重量为%d\n", first, coin[first]);
}
else if(last-first==1){ //如果只剩下两个硬币(此时count不为)
if (first > 0) { //不是最开始的硬币
if (coin[first] == coin[0]) //如果第first和第个相等,说明first 位置不是伪币
solve(coin,count,first+1,last);
else//否则,说明first位置是伪币
solve(coin,count,first,last-1);
}
else if(last if (coin[first]==coin[count-1]) //如果第first和最后一个相等,说明last位置不是伪币 solve(coin,count,first+1,last); else//否则,说明first位置是伪币 solve(coin,count,first,last-1); } } else if (first int temp=(last-first+1)/3; //将硬币分为三组 int sum1=0, sum2=0; for(int i=0;i sum1+=coin[first+i]; sum2+=coin[last-i]; } if (sum1==sum2){ //两边的总重相等,在中间,递归 solve(coin,count,first+temp,last-temp); } else {//在两边,不在中间 if (sum1==coin[first+temp]*temp){ //左边的和中间的相等,在右边,递归 solve(coin,count,last-temp+1,last); } else { solve(coin,count,first,first+temp-1); //右边的和中间的相等,在左边,递归 } } } } void main() { int i; int coin[N]; //定义数组coin用来存放硬币重量 for(i=0;i coin[i]=0; //所用硬币初始值为 coin[N1]=1; //第N1个设置为,即伪币 int cnt = N; printf("硬币个数:%d\n",cnt); solve(coin,cnt,0,cnt-1); } 2找零钱问题 (1)零钱个数无限制的时候: 源程序: //c语言实现 #include main(){ int T[]={25,10,5,1}; int a[5]; int money,i,j; printf("输入钱数:\n"); scanf("%d",&money); for(i=0;i<4;i++){ a[i]=money/T[i]; money=money%T[i]; } printf("找钱结果:\n硬币:\t"); for(i=0;i<=3;i++){ printf("%d\t|\t",T[i]); } printf("\n个数:\t");