0
点赞
收藏
分享

微信扫一扫

减治法实现假币问题求解

潇湘落木life 2022-04-14 阅读 54

减治法求解假币问题

减治法:将原问题分解为若干个子问题,并且原问题的解与子问题的解之间存在某种确定的关系,这种关系通常表现为:
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;
}

输出结果:
在这里插入图片描述

举报

相关推荐

0 条评论