实验六 分治法求解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六分治法求解

实验项目:

老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。

要求:

请用分治法解决上述问题。简述设计思路,给出源程序和运行结果。

设计思路:

假设袋中有n块金。当n很小时,如n=2时,要找出最重的金块,一次就够了。当n比较大时(n>2),首先,把这袋金块分成两个小袋A和B,然后分别找出A和B中最重和最轻的金块,最后比较A中和B中最重和最轻的,这样就可以找到最重和最轻的金块。

原程序:

#include

int min(int x,int y){

if(x

return x;

else

return y;

}

int max(int x,int y){

if(x>y)

return x;

else

return y;

}

int F_min(int A[],int left,int right){

int la,ma,ra;

if(left==right){

int min;

min=A[right];

return min;

}

if(right-left==1)

{la=A[left];

ra=A[right];

return(min(la,ra));

}

if(right-left>1){

ma=(left+right)/2;

la=F_min(A,left,ma);

ra=F_min(A,ma,right);

return(min(la,ra));

}

}

int F_max(int A[],int left,int right){ int la,ma,ra;

if(left==right){

int max;

max=A[right];

return max;

}

if(right-left==1)

{

la=A[left];

ra=A[right];

return(max(la,ra));

}

if(right-left>1){

ma=(left+right)/2;

la=F_max(A,left,ma);

ra=F_max(A,ma,right);

return(max(la,ra));

}

}

int main(){

int A[10000];

int n;

int i;

int l,h;

printf("请输入金块数目:");

scanf("%d",&n);

printf("请输入各金块的重量:");

for(i=0;i

scanf("%d",&A[i]);

printf("最重的金块:");

h=F_max(A,0,n-1);

printf("%d",h);

printf("\n");

printf("最轻的金块:");

l=F_min(A,0,n-1);

printf("%d",l);

return 0;

}

相关文档
最新文档