奇妙算法之毒药问题

问题:有1000杯水,其中有一杯是毒水,现在需要从中找出含毒药的水,可以用老鼠来实验;老鼠如果喝了有毒的水,必死,请问如何安排试验,能够用最少的实验材料检测出有毒的水?

思考?


常规方法是用1000只老鼠,分别给它们喝这1000杯水,但显然用到的老鼠太多,工作量太大。1000,如果想的比较深,能够想到1024,对于学习计算机的同学来说,是个非常熟悉的数字,1024=2^10;暂时想不出这之间有什么关系,可以先放着。


如果我们用n只老鼠,喝过水后,对于老鼠来说有两种状态:活,死。我们是否可以从n只老鼠的死活中找出有毒的水,再往深处想:n只老鼠会出现2^n中结果,联想到前面1024=2^10,我们可以用2^n中状态分别表示1000杯水,n =10,所以用10只老鼠即可。


剩下的就是怎么安排10只老鼠喝水。把10只老鼠从右往左依次排开,对应与2进制中的位。给1000杯水分别别号1,2,3,4,… ,1000.
将其编号全部转换成2进制,0000000001,0000000010,0000000011,0000000100,….,1111101000.
把2进制中的10位对应于10只老鼠。如果位是1,就给对应的老鼠喝水,例如0010010011,就给第1,2,5,8只老鼠喝这一杯水。


最后观察这10只老鼠中,哪些死亡,如果第5,9,10只老鼠死亡,死亡位标志为1,即00001000011=64+2+1=67,所以第67杯水即为毒水。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值