《算法设计与分析》实验一
算法设计与分析实验报告
实验报告题目实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
二、实验内容设计一个递归和分治算法,找出数组的最大元素,找出x在数组A中出现的次数。
三、实验要求(1)用分治法求解…问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1.设计一个递归算法,找出数组的最大元素。
2.设计一个分治算法,找出x在数组A中出现的次数。
3.写一个主函数,调用上述算法。
五、实验结果分析(分析时空复杂性,设计测试用例及测试结果)时间复杂性:最好情况下,O(n)最坏情况下:O(nlog(n)空间复杂性分析:O(n)六、实验体会通过写递归与分治策略实验,更加清楚的知道它的运行机理,分治法解题的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
做实验重在动手动脑,还是要多写写实验,才是硬道理。
七、附录:(源代码)#include"stdio.h"#define ElemType intint count(ElemType a[],int i,int j,ElemType x){int k=0,mid; //k用来计数,记录数组中x出现的次数if(i==j){if(a[i]==x) k++;return k;}else{mid=(i+j)/2;k+=count(a,i,mid,x);k+=count(a,mid+1,j,x);}return k;}ElemType Maxitem(ElemType a[],int n){ElemType max=a[n-1],j;if(n==1){max=a[n-1];return max;}else{j=Maxitem(a,n-1);if(j>max) max=j;return max;}}void main(void){ElemType a[]={1,5,2,7,3,7,4,8,9,5,4,544,2,4,123};ElemType b;ElemType x;int n;b=Maxitem(a,15);printf("数组的最大元素为%d\n",b);printf("输入想要计数的数组元素:\n");scanf("%d",&x);n=count(a,0,14,x);printf("%d在数组中出现的次数为%d次\n",x,n);}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
算法设计与分析实验报告三篇
算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。
2、掌握算法渐近复杂性的数学表述。
3、掌握用C++语言描述算法的方法。
4.实现具体的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6 页用数字6 表示,而不是06 或006 等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。
编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。
把这些结果统计起来即可。
四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。
《算法设计与分析》实验报告实验一...
《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。
1、求n个元素的全排。
(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。
(30分)3、设有n=2k个运动员要进行网球循环赛。
设计一个满足要求的比赛日程表。
(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。
三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
算法设计与分析实验报告
实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。
三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。
如果a>b则交换位置,如果a<b则不交换。
四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。
二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。
递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。
算法设计与分析实验报告
算法设计与分析实验报告姓名:班级:计算机科学与技术102班学号:1090教师:设计时间:2012.04.23编程工具:C-Free 5.0【实验一】:使用递归方法输出杨辉三角杨辉三角.cpp//使用递归方法输出杨辉三角,每个数字占用4个空格位#include <stdlib.h>#include <stdio.h>int calcit(int x, int y){if (x==y||y==0)return 1;elsereturn calcit(x-1,y-1)+calcit(x-1,y);}int main(){int i, j,k,n;printf("请输入行数(最好<=13):");scanf("%d",&n);for (i = 0; i<n; i++){for(k=(n-i)*2;k>0;k--)printf(" ");for (j=0;j<=i;j++)printf("%4d",calcit(i, j));printf("\n");}return 0;}【实验二】:快速排序(一)快速排序.cpp#include<stdio.h>#include<stdlib.h>#define SIZE 100void quick_sort(int data[],int x,int y);int pation(int data[],int x,int y);int main(){int i,n,data[SIZE];printf("请输入要排列的数目(<=100):");scanf("%d",&n);printf("请输入要排列的数列:\n");for(i=0;i<n;++i)scanf("%d",&data[i]);quick_sort(data,0,n-1);printf("排列后的数列为:\n");for(i=0;i<n;++i)printf( "%d ",data[i]);printf("\n");return 0;}void quick_sort(int data[],int x,int y){if(x>=y) return;int q=pation(data,x,y);quick_sort(data,x,q-1);quick_sort(data,q+1,y);}int pation(int data[],int x,int y){int n=data[x],i=x+1,j=y,temp;while(1){while(data[i]<n) ++i;while(data[j]>n) --j;if(i>=j) break;temp=data[i]; data[i]=data[j]; data[j]=temp;}data[x]=data[j];data[j]=n;return j;}(二)插入排序.cpp#include<stdio.h>#include<conio.h>#define X 100#define Y 100int main(){int a[X],r[Y];int *p;int i,j,n;printf("请输入要排列的数目(<=100):");scanf("%d",&n);printf("请输入要排列的数列:\n");for(i=0;i<n;i++){p=&a[i];scanf("%d",p);r[i+1]=a[i];}r[0]=1;for(i=2;i<=n;i++){r[0]=r[i];j=i-1;while(r[j]>r[0]){r[j+1]=r[j];j--;}r[j+1]=r[0];}printf("排列后的顺序是:\n");for(i=1;i<=n;i++){p=&r[i];printf("%d ",*p);}printf("\n");return 0;}【实验三】:趣味矩阵(一)次上三角的自动打印次上三角的自动打印.cpp#include "stdio.h"#include "stdlib.h"#define MAX 100void InterestMatrix(int n){int a[MAX][MAX];int k=1,m=0; // 计数器int i,j;//矩阵初始化for(i=0;i<n;i++){for(j=0;j<=i;j++)a[i][j]=k++;}//打印矩阵for(i=0;i<n;i++){m=i;for(j=0;j<n-i;j++)printf("%d ",a[m++][j]);printf("\n");}}int main(){int n;printf("输入矩阵的阶数n:");scanf("%d",&n);printf("\n");InterestMatrix(n);printf("\n");return 0;}(二)特殊趣味矩阵的打印趣味矩阵.cpp//使左对角线和右对角线上的元素为0,它们上方的元素为1,左边的元素为2,下方的元素为3,右边的元素为4#include<stdio.h>int main(){int i,j,a[100][100],n;printf("请输入矩阵的阶数:");scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j||i+j==n+1)a[i][j]=0;if(i<j&&i+j<n+1)a[i][j]=1;if(i>j&&i+j<n+1)a[i][j]=2;if(i>j&&i+j>n+1)a[i][j]=3;if(i<j&&i+j>n+1)a[i][j]=4;}for(i=1;i<=n;i++){printf("\n");for(j=1;j<=n;j++)printf("%d ",a[i][j]);}printf("\n");return 0;}。
2021年《算法设计与分析》实验指导
《算法设计与分析》实验指导《算法分析与设计》实验指导 .1 实验一锦标赛问题 [实验目的] 1. 基本掌握分治算法的原理. 2. 能用程序设计语言求解锦标赛等问题的算法; [预习要求] 1. 认真阅读数据结构教材和算法设计教材,了解分治算法原理; 2. 设计用分治算法求解背包问题的数据结构与程序代码. [实验题] 【问题描述】设有 n=2 k 个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他 n-1 个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在 n-1 天内结束。
请按此要求将比赛日程表设计成有 n 行和 n-1 列的一个表。
在表中的第 i 行,第 j 列处填入第 i 个选手在第 j 天所遇到的选手。
其中 1≤i≤n,1≤j≤n-1。
[实验提示] 我们可以按分治策略将所有的选手分为两半,则 n 个选手的比赛日程表可以通过 n/2个选手的比赛日程表来决定。
递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。
这时只要让这两个选手进行比赛就可以了。
1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 6 7 8 5 3 4 1 2 7 8 5 6 1 2 3 4 3 2 1 8 5 6 7 1 2 3 4 5 6 7 8 1 4 3 2 1 2 1 4 3 6 5 8 7 2 1 4 3 1 2 3 4 1 2 7 8 5 6 3 2 1 4 2 1 4 3 2 1 8 7 6 5 4 3 2 1 (1)(2)(3)图 1 2 个、4 个和 8 个选手的比赛日程表图 1 所列出的正方形表(3)是 8 个选手的比赛日程表。
其中左上角与左下角的两小块分别为选手 1 至选手 4 和选手 5 至选手 8 前 3 天的比赛日程。
据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这2 样我们就分别安排好了选手 1 至选手 4 和选手 5 至选手 8 在后 4 天的比赛日程。
算法分析与设计实验一
算法分析与设计实验一实验内容分别针对随机生成的三组整数序列(规模为1000个数、10000个数、100000个数)进行排序,排序算法使用以下五种经典的方法,分别是:冒泡排序算法,选择排序算法,插入排序算法,归并排序算法和快速排序算法。
实验目的回顾并熟悉常用的排序算法。
通过实验体会算法设计对问题求解效率所产生的深刻影响。
算法设计的基本思路选择排序在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
直接插入排序在要排序的一组数中,假设前面(n-1)[n=2]个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。
如此反复循环,直到全部排好顺序。
冒泡排序在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
归并排序算法合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。
它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个N/2个长度为2或1的有序子序列,再两两合并,如此重复,直到得到一个长度为N的有序数据序列为止,这种排序方法称为2-路合并排序。
快速排序快速排序是对冒泡排序的一种本质改进。
它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。
在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。
快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。
然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
《算法设计与分析》实验报告:实验一(分治策略)
实验一我保证没有抄袭别人作业!1.实验题目必做:n 用分治思想设计实现二分搜索、合并排序,并且用不同数据量进行实验对比分析。
选做:阶乘(递归与分治)。
2.实验目的掌握设计算法的分治策略,通过实验学习分治策略设计技巧, 理解递归的概念验证二分搜索的时间复杂度。
掌握算法效率的分析和实验验证方法。
3.算法设计3.1 分治法基本思想将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。
然后递归的解这些子问题,然后将这些子问题的解合并得到原问题的解。
3.2二分搜索技术分解(devide):将n个元素分成个数大致相同的两半。
此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):取a[n/2]与欲查找的x作比较。
如果x=a[n/2],则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部继续搜索x。
如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
合并(combine):此结果无需合并。
3.3合并排序分解(devide):将n个元素分成个数大致相同的两半。
此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):递归解n/2规模的子问题合并(combine):合并已排好序的两部分进行合并。
3.4快速排序分解(devide):找到基准元素,将数组分为三部分,两段。
此时,原问题a[p,r]->子问题a[p,q-1]、a[q]、a[q+1,r]。
解决(conquer):通过递归调用快速排序,对数组a[p,q-1]与a[q+1,r]进行排序。
合并(combine):此结果无需合并,因为子数组都是原址排序得,所以不需要合并操作。
3.5阶乘分解(devide):将n!分成n*(n-1)!,每次使其规模减少一。
解决(conquer):如果n=0,则输出结果1。
如果n=1,则输出结果1。
算法分析实验指导书(王红梅)
《算法设计与分析》实验指导书计算机科学与技术学院石少俭实验一分治法1、实验目的(1)掌握设计有效算法的分治策略。
(2)通过快速排序学习分治策略设计技巧2、实验要求(1)熟练掌握分治法的基本思想及其应用实现。
(2)理解所给出的算法,并对其加以改进。
3、分治法的介绍任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
算法设计与分析实验报告
算法设计与分析实验报告实验一全排列、快速排序【实验目的】1. 掌握全排列的递归算法。
2. 了解快速排序的分治算法思想。
【实验原理】一、全排列全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。
任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n 个数字的排列为例说明排列的生成法。
n个字符的全体排列之间存在一个确定的线性顺序关系。
所有的排列中除最后一个排列外,都有一个后继;除第一个排列外,都有一个前驱。
每个排列的后继都可以从它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。
二、快速排序快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
【实验内容】1.全排列递归算法的实现。
2.快速排序分治算法的实现。
【实验结果】1. 全排列:2. 快速排序:实验二最长公共子序列、活动安排问题【实验目的】1. 了解动态规划算法设计思想,运用动态规划算法实现最长公共子序列问题。
2. 了解贪心算法思想,运用贪心算法设计思想实现活动安排问题。
【实验原理】一、动态规划法解最长公共子序列设序列X=和Y=的一个最长公共子序列Z=,则:i. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;ii. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;iii. 若xm≠yn且z k≠yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=,Yn-1=,Zk-1=。
最长公共子序列问题具有最优子结构性质。
由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。
算法设计与分析实验报告
}
}
//回溯法求取最优解
void Traceback(int X[],int *W,int V[N][C],int n,int c)
{
int i,cu=c;
for(i=n;i>0;i--)
{
if(V[i][cu]==V[i-1][cu])
X[i]=0;
for(int i=1;i<=n;i++) //依次输入物品价值
cin>>v[i];
for(int i=1;i<=n;i++) //初始化物品放入量
X[i]=0;
float vs[N];
for(int i=1;i<=n;i++)
vs[i]=v[i]/s[i];
sort(s,v,vs,n); //按物品价值体积比从大到小排序
float s[N],v[N],X[N],totalv=0;
cout<<"请输入物品个数和背包容积:";
cin>>n>>c;
float cu=c;
cout<<"请依次输入物品体积:";
for(int i=1;i<=n;i++) //依次输入物品体积
cin>>s[i];
cout<<"请依次输入物品价值:";
cout<<v[i]<<" ";
cout<<endl;
cout<<"排序后物品价值体积比:";
《算法设计与分析》实验报告模板 (1)
《算法设计与分析》实验报告
学号:姓名:
实验一分治法求解众数问题
一、实验目的
1.掌握分治法的设计思想并能熟练应用;
2.理解分治与递归的关系。
二、实验题目
在一个序列中出现次数最多的元素称为众数,根据分治法的思想设计算法寻找众数。
三、实验程序
四、程序运行结果
实验二动态规划法求解单源最短路径问题
一、实验目的
1.深刻掌握动态规划法的设计思想;
2.熟练应用以上算法思想求解相关问题。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用动态规划法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验三贪心法求解单源点最短路径问题
一、实验目的
1.掌握贪心法的设计思想;
2.分析比较同一个问题采用不同算法设计思想求解的结果。
二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。
采用贪心法求解多段图从源点到终点的最小代价路径。
三、实验程序
四、程序运行结果
实验四回溯法求解0/1背包问题
一、实验目的
1.掌握回溯法的设计思想;
2.掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
二、实验题目
给定n种物品和一个容量为C的背包,选择若干种物品(物品不可分割),使得装入背包中物品的总价值最大。
采用回溯法求解该问题。
三、实验程序
四、程序运行结果。
算法分析实验一报告
《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.彼岸内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。
如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。
比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。
现在请问:yifenfei安然抵达彼岸的方法有多少种?输入:输入数据首先给出一个整数C,表示测试组数。
然后是C组数据,每组包含一个正整数n (n<40)。
输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。
每组输出占一行。
例如:输入:2 输出:92 2132.统计问题内容描述:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
输入:首先给出一个正整数C,表示有C组测试数据接下来的C行,每行包含一个整数n (n<=20),表示要走n步。
输出:请编程输出走n步的不同方案总数;每组的输出占一行。
例如:输入:2 输出:31 723.Message Decowing内容描述:The cows are thrilled because they've just learned about encrypting messages. Theythink they will be able to use secret messages to plot meetings with cows on other farms.Cows are not known for their intelligence. Their encryption method is nothing like DES or BlowFish or any of those really good secret coding methods. No, they are using a simple substitution cipher.The cows have a decryption key and a secret message. Help them decode it. The key looks like this:yrwhsoujgcxqbativndfezmlpkWhich means that an 'a' in the secret message really means 'y'; a 'b' in the secret message really means 'r'; a 'c' decrypts to 'w'; and so on. Blanks are not encrypted; they are simply kept in place. Input text is in upper or lower case, both decrypt using the same decryption key, keeping the appropriate case, of course.输入:* Line 1: 26 lower case characters representing the decryption key* Line 2: As many as 80 characters that are the message to be decoded输出:* Line 1: A single line that is the decoded message. It should have the same length as the second line of input.例如:输入:eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出:Jump the fence when you seeing me coming二、算法过程设计.第一题是一个典型的递归问题,通过对开始的几项附初始值,通过循环利用通项公式依次递归调用公式便可以得到第n项的值。
001.算法设计与分析实验一_20161104
实验编号: 1 四川师大《算法设计与分析》实验报告 2018 年 3 月 26 日计算机科学学院 2016 级 4 班实验名称:算法设计基础姓名:_ 邹琳___ 学号: 2016110458 指导老师:__苏菡 _ 实验成绩: __实验一算法设计基础一.实验目的(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
二.实验要求(1)认真填写实验报告,附加源代码(主要代码)和运行记录;(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析三.实验内容(1)统计数字问题(P8)(2)字典序问题(P8)(3)最多约数问题(P9)(4)最大间隙问题(P10)(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。
注:(1)、(2)、(5)必做,其余选做四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)统计数字问题(P8)实验代码:#include<iostream>#include<stdlib.h>#include"fstream"using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");int main(){int number[10] = { 0 };int i, n, m;int page=11;fin >> page;for (int j = 1; j <= page; j++){n = j;while (n){m = n % 10;number[m]++;n = n / 10;}}for (i = 0; i <= 9; i++){fout << number[i] << endl;}fin.close();fout.close();return 0;}运行截图:(2)字典序问题(P8)实验代码:#include<iostream>#include<stdlib.h>#include<cstring>#include"fstream"using namespace std;int dictionary(int m, int n){//计算小于k位的字符串有多少个int letter, a, b;letter = a = b = 1;if (m != 0){for (int i = n; i > n - m; i++)a = a*i;for (int j = 2; j <= m; j++)b = b*j;letter = a / b;}return letter;}int main(){freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);int number;cin >> number;for (int k = 0; k < number; k++){int i, j;char char1[10];int char2[10];cin >> char1;int sum = 1;int start = 1;int n = strlen(char1); //获取字符串的长度for (i = 1; i<n; i++)sum += dictionary(i, 26);//计算字母是字母表中的第几个位置for (i = 0; i < n; i++)char2[i] = char1[i] - 96;for (i = n; i >= 1; i--){for (j = 1; j < char2[n - i]; j++){sum += dictionary(i - 1, 26 - j);}start = char2[n - i] + 1;}cout << sum << endl;}return 0;}运行截图:(3)最多约数问题(P9)实验代码:#include<iostream>#include<stdlib.h>#include"fstream"using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");int main(){char ch[2] = { 1,36 };fin >> ch;int count, maxprime, maxdiv;//记录约数的个数,最多的约数和约数最多的数int i, j, k;//输入数的区间范围maxprime = 0; maxdiv = 0;for (i = ch[0]; i <= ch[1]; ++i)//求判断当前数的约数{k = i; count = 0;for (j = 1; j <= i; j++){if (i%j == 0){++count;}}}if (count>maxprime){maxprime = count;maxdiv = i - 1;}//printf("the maxdiv is:%d\n", maxdiv);//printf("the maxprime is:%d", maxprime);fout << maxprime << endl;fin.close();fout.close();return 0;}运行截图:(4)最大间隙问题(P10)实验代码:#include<iostream>#include<stdio.h>#include"fstream"#include<algorithm>using namespace std;ifstream fin("input.txt");ofstream fout("output.txt");double a[5] = {2.3,3.1,7.5,1.5,6.3}; int main(){int t=5;double x = 0.0;double max = 0.0;fin >> t;for (int i = 0; i<t; i++){fin>> a[i];}sort(a, a + t);for (int i = 0; i<t - 1; i++){x = a[i + 1] - a[i];if (x>max) {max = x;}}fout << max << endl;fin.close();fout.close();return 0;}运行截图:(5)设计算法求解Fibonacci数列的第110项的值,并统计和分析算法的时间性能。
《算法设计与分析》课程实验报告 (算法问题求解基础1)
}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。
算法设计与分析实验报告
算法设计与分析实验报告《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。
1、求n个元素的全排。
(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。
(30分)3、设有n=2k个运动员要进行网球循环赛。
设计一个满足要求的比赛日程表。
(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。
三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m) {if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
算法设计与分析实验报告
本科实验报告课程名称:算法设计与分析实验项目:递归与分治算法实验地点:计算机系实验楼110专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真指导教师:郝晓丽2018年05月04 日实验一递归与分治算法1.1 实验目的与要求1.进一步熟悉C/C++语言的集成开发环境;2.通过本实验加深对递归与分治策略的理解和运用。
1.2 实验课时2学时1.3 实验原理分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。
需要注意的是,分治法使用递归的思想。
划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。
最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。
1.4 实验题目1.上机题目:格雷码构造问题Gray码是一个长度为2n的序列。
序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。
试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。
对于给定的正整数n,格雷码为满足如下条件的一个编码序列。
(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2)序列中无相同的编码。
(3)序列中位置相邻的两个编码恰有一位不同。
2.设计思想:根据格雷码的性质,找到他的规律,可发现,1位是0 1。
两位是00 01 11 10。
三位是000 001 011010 110 111 101 100。
n位是前n-1位的2倍个。
N-1个位前面加0,N-2为倒转再前面再加1。
3.代码设计:}}}int main(){int n;while(cin>>n){get_grad(n);for(int i=0;i<My_grad.size();i++)cout<<My_grad[i]<<endl;My_grad.clear();}return 0;}运行结果:1.5 思考题(1)递归的关键问题在哪里?答:1.递归式,就是如何将原问题划分成子问题。
《算法设计与分析》实验报告
《算法设计与分析》实验报告网络10-1 李俊实验一分治与递归基本题一:基本递归算法四、程序清单:#include <iostream>using namespace std;int q(int n ,int m){if((n<1) || (m<1) )return 0;if((n==1) || (m==1)) return 1;if(n<m) return q(n,n);if(n==m) return q(n,m-1)+1;return q(n,m-1)+q(n-m,m);}int main (){int a,b,c;int q(int n, int m);cout << "please input a and b" <<endl;cin >>a>>b;c=q(a,b);cout <<"整数的划分为:"<<c<<endl;return 0;}测试数据及结果如下图所示:基本题二:棋盘覆盖问题程序清单:#include<iostream>#include<iomanip>using namespace std;int Board[1024][1024];//模拟棋盘int tile=0;//骨牌编号,从0开始void ChessBoard(int tr, int tc, int dr, int dc, int size);void OutputBoard(int size);int main(){int size,dr,dc;cout<<"请输入方阵的规格k(方阵为k*k,须为2的幂): ";cin>>size;cout<<"请输入特殊方格的行号(矩阵下标由零开始计算,即0~k-1): "; cin>>dr;cout<<"请输入特殊方格的列号(矩阵下标由零开始计算,即0~k-1): "; cin>>dc;ChessBoard(0,0,dr,dc,size);// 覆盖特殊棋盘OutputBoard(size);//输出覆盖后的棋盘return 0;}void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size==1)return;int t=tile++,//L型骨牌号s=size/2;//分割棋盘//覆盖左角子棋盘if(dr<tr+s&&dc<tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s-1][tc+s-1]=t;//把三格板t放在右下角,将此棋盘转化为特殊棋盘 ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//覆盖其余部分}//覆盖右上角棋盘if(dr<tr+s && dc>=tc+s)//特殊方格在此棋盘中ChessBoard(tr,tc+s,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s-1][tc+s]=t;//把三格板t放在左下角,将此棋盘转化为特殊棋盘 ChessBoard(tr,tc+s,tr+s-1,tc+s,s);// 覆盖其余部分}//覆盖左下角棋盘if(dr>=tr+s&&dc<tc+s)//特殊方格位于本棋盘ChessBoard(tr+s,tc,dr,dc,s);else {//本棋盘中没有特殊方格Board[tr+s][tc+s-1]=t;//把三格板t放在右上角,将此棋盘转化为特殊棋盘 ChessBoard(tr+s,tc,tr+s,tc+s-1,s);//覆盖其余部分}// 覆盖右下角棋盘if (dr>=tr+s&&dc>=tc+s)//特殊方格位于本棋盘ChessBoard(tr+s,tc+s,dr,dc,s);else{//本棋盘中没有特殊方格Board[tr+s][tc+s]=t;// 把三格板t放在左上角,将此棋盘转化为特殊棋盘ChessBoard(tr+s,tc+s,tr+s,tc+s,s);//覆盖其余部分}}void OutputBoard(int size){int i,j;for(i = 0; i < size; i++){for (j = 0; j < size; j++)cout << setw (5) << Board[i][j];cout << endl;}}测试数据及结果如下图所示:提高题一:二分搜索1、设a[0:n-1]是一个已排好序的数组。
算法设计与分析实验1报告
湖南科技学院实验报告系部 数学与计算科学 专业 信息与计算科学 成绩评定班级 信计0902班 学号200905002231 姓名易丹课程名称 算法设计与分析实验时间 2012.3.09实验编号 实验一实验名称分治与递归实验环境D315、一台电脑、Codeblocks10.05实验目的1. 理解递归的概念。
2. 掌握设计有效算法的分治策略。
3. 掌握C++面向对象编程方法。
实验内容(①算法、程序、步骤和方法 ②输入、输出、实验结果 ③实验结果分析) 实验内容:已知有某班学生的成绩如下:在程序中创建一个学生对象数组并初始化数据,完成如下编程任务。
⑴ 找出成绩排名第4的学生,输出其姓名。
要求:①编写功能较为完善的学生类,重载必要的运算符; ②使用快速排序的方法。
⑵ 使用分治法找出成绩最高和成绩最低的学生,输出他们的姓名。
实验要求:①实验报告只写实验⑵。
②写出算法思想、主要程序代码、算法复杂性分析。
实验(2)的步骤、算法及运行结果:⑴打开Codeblocks10.05,编辑如下分治法程序,运行即可得到成绩最高和成绩最低的学生姓名。
QuickSort.h姓名 a b c d e f g h i j 成绩 86436782337579596095#ifndef QUICKSORT_H_INCLUDED#define QUICKSORT_H_INCLUDEDtemplate<typename Type>void Swap(Type &a,Type &b){Type t=b;b=a;a=t;}template<typename Type>int Partition(Type a[],int p,int r){//以a[p]为基准元素,对数组a[p:r]进行划分int i=p,j=r+1;Type x=a[p];while(true){while(a[++i]<x&&i<r);while(x<a[--j]);if(i>=j)break;Swap(a[i],a[j]);}a[p]=a[j];a[j]=x;return j;}template<typename Type>void QuickSort(Type a[],int p,int r){//对数组a[p:r]进行快速排序if(p<r){int q=Partition(a,p,r);QuickSort(a,p,q-1);QuickSort(a,q+1,r);}}#endif // QUICKSORT_H_INCLUDEDmain.cpp#include <iostream>#include "QuickSort.h"using namespace std;class Student{public:Student(){name="noname";score=0;}Student(string n,int s){name=n;score=s;}bool operator <(Student b){if(this->score<b.score)return true;elsereturn false;}operator int(){return this->score;}friend ostream& operator<<(ostream &out,Student &s); private:string name;int score;};ostream& operator<<(ostream &out,Student &s){out<<;return out;}void MaxMm(Student a[],int p,int r,Student &Max,Student &Min) {Max=Min=a[p];if(r-p+1==1)Min=Max=a[r];if(r-p+1==2){if(a[r]<a[p]){Max=a[p];Min=a[r];}else{Max=a[r];Min=a[p];}}if(r-p+1>2){int mid=(p+r)/2;Student max1,min1;MaxMm(a,p,mid,Max,Min);MaxMm(a,mid+1,r,max1,min1);if(Max<max1)Max=max1;if(min1<Min)Min=min1;}}int main(){Student a[]= {Student("a",86),Student("b",43),Student("c",67),Student("d",82),Student("e",33),Student("f",75),Student("g",79),Student("h",59),Student("i",60),Student("j",95)};Student Max,Min;MaxMm(a,0,9,Max,Min);cout<<"成绩最高的学生:"<<Max<<endl;cout<<"成绩最低的学生:"<<Min<<endl;}运行结果:实验总结一直都觉得学算法设计与分析很难、很纠结,尤其是还要上机实践。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号**********《算法设计与分析》实验报告一学生姓名张曾然专业、班级16软件二班指导教师唐国峰成绩计算机与信息工程学院软件工程系2018 年9 月19 日实验一:递归策略运用练习一、实验目的本次实验是针对递归算法的算法设计及应用练习,旨在加深学生对该算法原理的理解,提高学生运用该算法解决问题的能力。
二、实验步骤与要求1.实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;2.学生独自完成实验指定内容;3.实验结束后,用统一的实验报告模板编写实验报告。
4.提交说明:(1)电子版提交说明:a 需要提交Winrar压缩包,文件名为“《算法设计与分析》实验一_学号_姓名”,如“《算法设计与分析》实验一_09290101_张三”。
b 压缩包内为一个“《算法设计与分析》实验一_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验报告电子版”。
其下分别放置对应实验成果物。
(2)打印版提交说明:a 不可随意更改模板样式。
b 字体:中文为宋体,大小为10号字,英文为Time New Roman,大小为10号字。
c 行间距:单倍行距。
(3)提交截止时间:2018年10月10日16:00。
三、实验项目1.运用递归策略设计算法实现下述题目的求解过程。
题目列表如下:【必做题】(1)运动会开了N天,一共发出金牌M枚。
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
(2)国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?财产共分成了多少份?(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。
问这鱼缸里原有多少条金鱼?(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?(5)猴子吃桃。
有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?(6)小华读书。
第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少钱页?(7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。
分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。
结果大家手中的桔子正好一样多。
问六兄弟原来手中各有多少桔子?(8)某种传染病第一天只有一个患者,前5天为潜伏期,不发作也不会传染人,第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人,求第N天共有多少患者。
【选做题】(5选3)(1)为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!某批警察叔叔正在进行智力训练:1 2 3 4 5 6 7 8 9 = 110;请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。
之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。
形如:12+34+56+7-8+9123+4+5+67-89(2)递归将一个整数输出。
形如654321,输出1,2,3,4,5,6(3)用递归实现分解质因数。
形如:12=2*2*3(4)50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?(5)电话号码对应的字符组合。
题目:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。
那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。
现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
四、实验过程(一)题目一:运动会开了N天,一共发出金牌M枚。
第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。
到了第N天刚好还有金牌N枚,到此金牌全部发完。
编程求N和M。
1.题目分析由题意得,本题存在两个未知数,分别是金牌的总数m和运动会进行的天数n,所以很难从第一天开始进行正向推倒从而算出本题的答案,经过思考我发现本题的突破口是在“到了第N天刚好还有金牌N枚”这句话上,所以可以从最后一天发的金牌数中开始切入。
推倒出了表达式就可以采用递归的思想来进行问题的解答了递归有两个重要组成部分:递归方程:前一天所剩金牌=当天所剩金牌*7/6+当天天数。
边界条件:当天的前一天所剩金牌数和当天的天数相等。
2.算法构造在此论证算法设计中的一些必要的设计依据。
已经完成了题目分析下面就要将递归方程:(前一天所剩金牌-当天天数)*6/7=当天所剩金牌用代码表示出来,可以通过一个二元数组或者链表结构将当前天数和剩余的金牌数存放起来,设置一个哨兵用来判断(前一天剩余的金牌数-当天天数)能否被7整除,若果不能被7整除则证明所设置的初值不正确,3.算法实现程序源代码(请写入必要的注释)。
First类:package ;public class First {public static int broken(int num, int today) {//num为前一天所剩的金牌数,today为当天天数if ((num-today)%7!=0) //判断前一天所剩金牌数-当天天数能否被7整除,不可以返回0return 0;else//如果可以返回当天剩余金牌的数量return (num-today) *6/7;}}测试类:package ;import java.util.LinkedList;public class Test {static First one=new First();public static void main(String[] args) {LinkedList<Integer> lt = new LinkedList<Integer>();for(int n=3;n<10;n++) {// 根据题干可知,n>=3,将n的初值设为3可以降低递归算法的重复率for(int m =1;m<100;m++) {//利用穷举法计算m的值lt.add(0,m);// 第一天没发之前一共有m枚金牌for(int i=1;i<=n;i++) {//调用第一题中的判断算法,依次计算每天发了多少枚lt.add(i,one.broken(lt.get(i-1),i));//到达第n天依旧没有符合终止条件的情况跳出循环}if (lt.get(n-1)-n==0) {//第n天发了n枚金牌循环终止条件System.out.println("金牌总数为:"+lt.get(0)+",运动会进行天数为:"+n);}}}}}4.运行结果5.经验归纳算法的设计远比想象中的要困难,不紧要熟练掌握高级语言的使用方法,还要透彻的理解题意,仅仅知道递归方程和终结条件是远远不够的,还要在恰当的位置加上准确的判定条件,否则程序将无法达到目标结果。
(二)题目二:国王分财产。
某国王临终前给儿子们分财产。
他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i个儿子i份,再加上剩余财产的1/10。
每个儿子都窃窃自喜。
以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。
请用程序回答,老国王共有几个儿子?财产共分成了多少份?。
1.题目分析本题也存在两个未知数,国王儿子的数量n,以及财产的总数m,由题意得,国王分财产是“一碗水端平的”所以有多少个儿子财产就被分成了多少份,所以可以从最后一个儿子也就是第i个儿子入手,如下图所示:递归方程为:前一位王子所剩财产=后一位王子所剩财产数*10/9+前一位王子数。
边界条件:当第i个儿子分到m/i财产,每个王子都能被9整除时循环终止。
2.算法构造在此论证算法设计中的一些必要的设计依据。
本算法我运用了两个循环,外循环是判断循环终止条件(结合实际当份数第一次满足条件时,即跳出循环不然国王的孩子会越来越多),内循环判断是否每个王子得到的财产都能被9整除。
3.算法实现程序源代码(请写入必要的注释)。
package ;public class Treasure {public static void main(String[] args) {int i=0;int n=0;int prince[]=new int[100]; //规定一个边界值,以免数值过大影响计算速度(本题已经确定份数在100份以内)while(true){ //如果没有break则继续循环n=n+9; //因为财产数必为9的倍数prince[n]=n; //第n个王子得到n份for(i=n-1;i>=1;i--) //从最后一个王子开始往前算每一位王子所拥有的财产能否被9整除{ //不能则跳出循环,n再加9,可以的话再判断前一位if(prince[i+1]%9!=0) {break;}else prince[i]=prince[i+1]*10/9+i;}if(i==0) break; //当所有王子所拥有的财产都能被9整除,及经过若干次i--之后i变成了零} //跳出外循环,完成循环终止条件,得出结果System.out.println("国王一共有"+n+"个儿子");System.out.println("一共有资产"+n*prince[1]+",总共分了"+prince[1]+"份");}}4.运行结果5.经验归纳本题与第一题相似只是细微的部分发生了改变,设计的难点还是很难找到循环终止条件(三)题目三出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。