1000瓶藥水和10只老鼠的問題及其擴展

一,常規的問題

問題背景:

1000瓶藥水,有一瓶有毒,小老鼠喝下去之後會在1小時死亡。問給你一小時你需要多少隻老鼠才能檢測出那瓶是毒藥?

分析問題:
最優的方法是進製法去求解。因爲時間是一個小時在喝下藥水之後小老鼠的狀態有生和死兩種狀態,對應着二進制中的0和1,因此可以用二進制的想法去求解。因爲

2^10=1024

所以需要10只老鼠就可以檢測出毒藥。先給出解法步驟:

解法:1,將1000瓶藥水按照二進制進行標記;

2,定義10個符號位,從左至右分別爲符號位1....10,每個符號位爲0或者1。10只老鼠按照從左到右的位置,代表每一個符號位的位置;

3,對於每個老鼠按照如下操作:喝其相應位置中序列爲1的藥水,如果一個小時候老鼠死了,那麼該序列爲1,如果沒死,則該序列爲0.

4,最後得到每個序列對應的數字就是有毒的那瓶藥水的二進制編碼。

懵逼吧。舉個栗子就好理解了。問題簡化成4瓶藥水,兩隻老鼠,來看看。

兩隻老鼠A,B;4瓶藥水00,01,10,11

 答案:_ _

目標是求出答案中兩個符號位的數字。假設現在有毒的是10

A表示左一位置的狀態,B表示左二位置的狀態。

A喝第一位置中序列爲1的藥水,就是10,11,結果死了(因爲10有毒),那麼左一的符號位是1;

B喝第二位置中序列爲1的藥水,就是01,11,結果沒死,那麼左二的符號位是0;

最後得到有毒的是標記爲10的那瓶,跟我們設置的一樣。

還不明白的可以調換一下有毒的瓶子,再自己推演一下就能明白了。

二,一個問題

明白的繼續往下看,想一個問題:爲什麼死的時候置爲1,生的時候置爲0 ?

這個問題很關鍵,如果明白了這個問題,下面的擴展就很容易理解了了。

如果你覺得我把這個問題想明白了,那恐怕你要失望了,我沒有完全弄懂。

不過我知道設置爲1還是0是跟小老鼠喝藥水的序列號是相關的,如果喝的是序列1的那麼死爲1生爲0;如果喝的是序列0的那麼死爲0生爲1.得到的結論就是:喝序列號是多少,那麼死就設置成該序列號。

不相信的可以以上面兩隻老鼠4瓶藥水爲例,以喝序列號爲0,死爲0生爲1,推演一遍。

三,問題擴展

記住上面的結論:小老鼠喝序列號是多少,那麼死就設置成該序列號

繼續看問題的擴展:

1000瓶藥水,有一瓶有毒,小老鼠喝下去之後會在1小時死亡。假設現在給你兩個小時你需要至少需要多少隻老鼠能檢測出那瓶是毒藥?

還是以進製法爲基礎進行分析:

小老鼠在喝完藥水一個小時之後會產生狀態,那個兩個小時小老鼠會有多少狀態?

答案是三種。即,死,生死,生生。

以生死爲例,表示小老鼠喝完藥水一個小時之後活蹦亂跳的,再繼續和藥水一個小時之後死了。其他兩種情況可以自己推算到。

那麼就是說老鼠有三種狀態,則可以用三進制的思路去考慮問題了。因爲

3^5=243>100

因此理論上5只老鼠就可以算出哪瓶有毒。解法如下:

解法:1,將1000瓶藥水按照三進制進行標記;

2,定義5個符號位,從左至右分別爲符號位1....5,每個符號位爲0,1或者2。5只老鼠按照從左到右的位置,代表每一個符號位的位置;

3,對於每個老鼠按照如下操作:喝其相應位置中序列爲0的藥水,如果一個小時候老鼠死了,那麼該序列爲0;如果沒死,喝其相應位置中序列爲1的藥水,如果死了,則該序列爲1,如果活着則該位置爲2;
(因爲一個小時能知道小老鼠的狀態,因此兩個小時可以喝兩次藥水)
4,最後得到每個序列對應的數字就是有毒的那瓶藥水的三進制編碼。

還是懵逼?沒關係繼續舉個栗子就好理解了。問題簡化成8瓶藥水,兩隻老鼠,來看看。

兩隻老鼠A,B;4瓶藥水00,01,02,10,11,12,20,21

 答案:_ _

目標是求出答案中兩個符號位的數字。假設現在有毒的是10

A表示左一位置的狀態,B表示左二位置的狀態。

A喝第一位置中序列爲0的藥水,就是00,01,02,沒死;繼續和第一位置爲1的藥水,就是10,11,12,結果死了(因爲10有毒),那麼左一的符號位是1

B喝第二位置中序列爲0的藥水,就是00,10,20,結果死了(因爲10有毒),那麼左二的符號位是0

最後得到有毒的是標記爲10的那瓶,跟我們設置的一樣。

相信你已經看明白了吧。

那麼如果再擴展一下,假定給了3個小時,100瓶藥水至少需要多少隻老鼠呢?

如果你看懂了肯定就知道答案了。

有什麼不懂的歡迎下方提問。

網上解釋的比較偏原理的連接:

http://blog.sciencenet.cn/blog-677221-669159.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章