实验六 分治法求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }