文章目录
1. 实验内容
1)减治法应用实现
在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的减治算法来检测出这枚假币。
int nCoin(int coin[], int n, int p, int q);
coin[]数组存储各枚硬币的重量。
2.算法分析
在假币问题中,每次用天平比较后,只需解决一个规模减半的问题,所以,它属于一个减治算法。解决这个问题的最自然的想法就是一分为二,也就是把n枚硬币分成两组A、B,每组有[n/2]枚硬币,如果n为奇数,就留下一枚硬币C,然后把两组硬币分别放到天平的两端。如果两组硬币的重量相同,那么留下来的硬币C就是假币;否则,假币就出现在和[n/2]*C重量不相等的一组里,重复上述过程直至找到假币。
2.1 算法的改进
考虑不是把硬币分成两组,而是分成三组,前两组有[n/3]枚硬币A和B,其余的硬币作为第三组C,将前两组硬币放入天平比较。如果他们的重量相同,那么假币一定在第三组C中,用同样的方法对第三组C进行处理;如果前两组的重量不相等,那假币就出现在和(C/ (n-[n/3]*2))*n/3重量不相等的一组里,重复上述过程直至找到假币。