算法分析与设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机算法设计与分析实验报告
目录
实验一 (1)
[实验题目] (1)
[问题描述] (1)
[算法设计] (1)
[算法分析] (1)
[源代码] (1)
[运行结果] (2)
实验二 (2)
[实验题目] (2)
[问题描述] (2)
[算法设计] (2)
[算法分析] (2)
[源代码] (2)
[运行结果] (4)
实验三 (5)
[实验题目] (5)
[问题描述] (5)
[算法设计] (5)
[算法分析] (5)
[源代码] (5)
[运行结果] (6)
实验一
[实验题目]
2-7集合划分问题
[问题描述]
n个元素的集合{1,2,…,n}可以划分为若干非空子集。例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集。
[算法设计]
给定正整数n,计算出n个元素的集合{1,2,…,n}可以划分为多少个不同的非空子集。
[算法分析]
本算法实现采用分治法思想,F(n,m)=F(n-1,m-1)+m*F(n-1,m)。假设将m个元素分解到n 个集合中,首先考虑将(m –(n - 1))个元素分到第一个集合中,将余下的(n - 1)个元素分别分配到余下的(n - 1)个集合中,然后再考虑将(m –(n - 2))个元素分配到第一个集合中,将余下的(n - 2)个元素分别分配到余下的(n - 1)集合中,依此类推,直到后面的有一个集合中的元素个数比第一个集合中的元素个数多为止。
[源代码]
#include
using namespace std;
int compute_bell(int row,int position)
{
if(row==1)
return 1;
if(row == 2 && position ==1)
return 1;
else
{
if(position == 1)
return compute_bell(row-1,row-1);
else
return compute_bell(row,position-1)+
compute_bell(row-1,position-1);
}
}
int main(){
int n=0;
int m;
cout<<"please input a number."< cin>>n; m=compute_bell(n,n); cout<<"the resule is "< } [运行结果] 实验二 [实验题目] 3-1独立任务最优调度问题 [问题描述] 用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有aj [算法设计] 对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。 [算法分析] 当完成k个作业,设机器A花费了x时间,机器B所花费时间的最小值肯定是x的一个函数,设F[k][x]表示机器B所花费时间的最小值。则F[k][x]=Min{ F[k-1][x]+b[k], F[k-1][x-a[k]] };其中F[k-1][x]+b[k]表示第k个作业由机器B来处理(完成k-1个作业时机器A花费的时间仍是x),F[k-1][x-a[k]]表示第k个作业由机器A处理(完成k-1个作业时机器A花费的时间是x-a[k])。 那么单个点对较大值Max(x, F[k][x]),表示此时(即机器A花费x时间的情况下)所需要的总时间。而机器A花费的时间x是变化的,即x=0,1,2……x(max),由此构成了点对较大值序列。要求整体时间最短,取这些点对较大值序列中最小的即可。 [源代码] #include #include #include using namespace std; const int SIZE=50; const int MAXINT=999; int main(){ while(1){ int N,a[SIZE],b[SIZE],SumA[SIZE],SumB[SIZE]; int tempSumA,tempSumB,MinSum; int i=0,j,k; tempSumA=tempSumB=0; int data; int oriData[SIZE]; ifstream ifile; ifile.open("input.txt"); if(ifile.eof()) { cerr<<"Fail to open the file input.txt"< } while(ifile>>data) { oriData[i++]=data; } N=(int)oriData[0]; for (i=1;i<=N;i++) { a[i]=oriData[i]; tempSumA+=a[i]; SumA[i]=tempSumA; } for (i=1,j=N+1;j<=2*N;j++,i++) { b[i]=oriData[j]; tempSumB+=b[i]; SumB[i]=tempSumB; } cout<<"Input.txt Data:"< cout< for (i=1;i<=2*N; ) { cout< i++; cout< i++; }