减治法求解假币问题
减治法:将原问题分解为若干个子问题,并且原问题的解与子问题的解之间存在某种确定的关系,这种关系通常表现为:
1)原问题的解只存在其中一个较小规模的子问题中;
2)原问题的解与其中一个较小规模的解之间存在某种对应关系。
假币问题:n个硬币中有一枚假币,不知道假币具体在哪一组?已知假币重量比真币轻,通过称量找到假币的位置。
设N枚硬币的重量存储在数组coin[N]中,函数Falsecoin实现假币问题的求解。
测试用例:coin[]={2,2,1,2,2,2,2,2}
#include<stdio.h>
int coin[]={2,2,1,2,2,2,2,2};
int Falsecoin(int high,int low,int n)//判断假币在哪一组
{
int num1,num2,num3;
int sum1=0,sum2=0;
if(n==1)//递归结束条件
return low+1;
if(n%3==0)//3组硬币的个数相同
num1=num2=n/3;
else
num1=num2=n/3+1;
num3=n-num1-num2;
for(int i=0;i<num1;i++)
sum1+=coin[low+i];//计算第一组重量和
for(int i=num1;i<num1+num2;i++)
sum2+=coin[i+low];//计算第二组重量和
if(sum1<sum2)
return Falsecoin(low+num1-1,low,num1);
else if(sum1>sum2)
return Falsecoin(low+num1+num2-1,low+num1,num2);
else
return Falsecoin(high,low+num1+num2,num3);
}
int main()
{
int i=Falsecoin(7,0,8);
printf("假币在第%d组!",i);
return 0;
}
输出结果: