设有n枚硬币其中仅有一枚假币在已知或未知假币与真币之间重量关系两种情况下通过无砝码天平称重的方法鉴别假币求所需的最少称重次数。要求:1试用信息论的原理进行分析并给出n=1239的具体称重策略;2用matlab编程实现可视化。
- 分析 假设有n枚硬币,其中仅有一枚假币,称重的过程可以看成是一棵二叉树,每次将n个硬币分为两组,分别称重,如果两组重量相等,则假币在剩余的n-2个硬币中;如果两组重量不等,则假币在重量较轻的那组中。显然,如果每次都能将硬币均分成两组,那么需要的最少次数为log2(n)。但是,由于有的时候硬币的数量不是2的整数次幂,所以需要一些特殊的方法来处理。
对于n=12的情况,可以将硬币分成4组,每组3个硬币。先将任意两组硬币称重,如果两组重量相等,那么假币在另外两组中,可以重复上述步骤;如果两组重量不等,那么假币在较轻的那组中,可以将较轻的那组再次分为两组,重复上述步骤即可。
对于n=39的情况,可以将硬币分成3组,分别为13个硬币的一组A,13个硬币的一组B,以及13个硬币和假币的一组C。首先将A和B称重,如果两组重量相等,则假币在组C中,可以将组C分成3组,每组各13个硬币,重复上述步骤即可。如果A和B的重量不等,那么假币在较轻的那组中,可以将较轻的那组C分成两组,一组为6个硬币,另一组为7个硬币和假币。将A和较轻的那组C称重,如果两组重量相等,则假币在另一组C中,可以将另一组C分成两组,重复上述步骤即可;如果A和较轻的那组C的重量不等,那么假币在较轻的那组中,可以将较轻的那组C中的7个硬币和假币分成3组,分别为3个硬币、3个硬币和1个硬币,将A和较轻的那组C中的6个硬币称重,如果两组重量相等,则假币在另一个C的3个硬币的那组中,可以将另一个C的3个硬币分成两组,重复上述步骤即可;如果A和较轻的那组C中的6个硬币的重量不等,那么假币在A的较轻的那组中,可以将A的较轻的那组中的6个硬币分成两组,重复上述步骤即可。
- 编程实现 可以使用Matlab编写一个可视化程序,将上述称重的过程可视化出来。程序的主要流程如下:
1)输入硬币的数量n和假币的位置p(假币的位置从1到n); 2)将硬币分成若干组,每组的大小不超过4个硬币,按照上述策略称重; 3)递归地进行上述步骤,直到找到假币的位置为止; 4)输出假币的位置。
程序代码如下
原文地址: https://www.cveoy.top/t/topic/fdES 著作权归作者所有。请勿转载和采集!