问题:
现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。
解决方式:
将八枚硬币分成三组:a、b、c一组,d、e、f一组,g、h一组。
首先将abc与def分别放置于天平两侧,可能出现三种比较结果
(1)a+b+c>d+e+f
(2)a+b+c=d+e+f
(3)a+b+c<d+e+f
若a+b+c>d+e+f,可以肯定这六枚硬币中必有一枚为假币,同时也说明g与h为真币。这时可将天平两端各去掉一枚硬币,假设去掉c和f同时a和e互换,然后进行第二次比较,比较的结构同样有三种:
①a+e>d+b:表明变换后两端的轻重关系保持不变,从而说明假币必然是a和d中一个,这时我们只要用一枚真币(例如h)与a进行比较,就能找出假币。若a>h,则a是较重的假币;若a=h,则d为较轻的假币;不可能出现a<h的情况
②a+e=d+h:表明假币在去掉的两枚硬币c和f中,其他步骤同①
③a+e<e+h:表明对换后平衡变向,假币在b和e中,其他步骤同①
(2)(3)情况步骤类似(1)分析。
可以用图表示:
python代码:
def compare(coins,i,j,k):
if coins[i]>coins[k]:
print("假币%d较重"%(i+1))
else:
print("假币%d较轻"%(j+1))
def eightcoin(coins):
if coins[0]+coins[1]+coins[2]==coins[3]+coins[4]+coins[5]:
if coins[6]>coins[7]:
compare(coins,6,7,0)
else:
compare(coins,7,6,0)
elif coins[0]+coins[1]+coins[2] >coins[3]+coins[4]+coins[5]:
if coins[0]+coins[3] == coins[1]+coins[4]:
compare(coins, 2, 5, 0)
elif coins[0]+coins[3] > coins[1]+coins[4]:
compare(coins, 0, 4, 1);
else:
compare(coins, 1, 3, 0);
elif coins[0]+coins[1]+coins[2] <coins[3]+coins[4]+coins[5]:
if coins[0]+coins[3] == coins[1]+coins[4]:
compare(coins, 5, 2, 0)
elif coins[0]+coins[3] > coins[1]+coins[4]:
compare(coins, 3, 1, 0);
else:
compare(coins, 4, 0, 1);
if __name__ == '__main__':
coins=[2,2,2,2,3,2,2,2]
eightcoin(coins)
#输出:假币5较重
参考:
https://blog.csdn.net/Hitmi_/article/details/81048125