這是乙個傳播得很廣的問題:有1000瓶液體。當中一瓶是毒藥。其它的都是清水。毒藥看上去和水一樣。僅僅能用老鼠來試驗。老鼠在喝了毒藥以後乙個星期後一天內的隨意時刻死亡。
最少須要多少僅僅老鼠才幹找到毒藥?
n瓶液體其中一瓶有毒,總共同擁有n種可能性,用集合n來表示。
一僅僅老鼠的生死能夠用0、1表示。
r僅僅老鼠的生死構成了乙個0、1串,這個0、1串能夠表示2的r次方中結果,用集合r表示。
我們就是要找乙個實驗方法,通過這些老鼠的生死獲取毒藥的編號。
假設做個抽象,這個實驗方法是f。f把n中元素分別對映到r上。我們從r中的結果能夠猜測出這個n中元素。
所以r中的元素須要和n中的元素相等。
因此2的r次方等於n, r = log(n)。
回到這個問題上來,理論上。我們須要10僅僅老鼠才幹找出隱藏的毒藥。
詳細來說應該怎麼操作呢,也就是我們要尋找一種演算法。
以及這樣的演算法能否僅僅用10僅僅老鼠就找到1000其中的毒藥呢?
假設有一僅僅老鼠,我們能夠讓它喝一半的藥水。
它的生死就能確定毒藥在哪一半。
比如n = 8。
000 001 010 011 100 101 110 111
老鼠a 1 1 1 1
老鼠a喝下編號為5到8的全部藥水以後,假設毒藥在右半邊。老鼠死;否則,老鼠活。
假設用二進位制去編碼藥水,一僅僅老鼠的生死能夠指示這一瓶毒藥某一位是0,還是1
最後的實驗方案是這種
000 001 010 011 100 101 110 111
a 1 1 1 1
b 1 1 1 1
c 1 1 1 1
不同的老鼠喝下自己一行中標註為1的藥水
假設是1000瓶藥水。依次用二進位制表示。
按照上面的方式我們能夠用10僅僅老鼠來找到唯一的毒藥。
以下重點說下這個問題的拓展。
假設1000瓶液體其中有兩瓶毒藥,最少須要的老鼠是多少呢,應該怎樣操作?
依據前面的方法。我們先計算理論上的下界。
毒藥的分布總共同擁有c(1000,2)中情況,我們最少須要19僅僅老鼠。
首先把毒藥平均分成兩組。怎樣確定毒藥在哪一組呢?
比如:a: 000 001 010 011
b: 100 101 110 111
一僅僅老鼠是不夠的
我們用兩僅僅老鼠a,b。
a喝下a組,b喝下b組。
假設兩僅僅老鼠所有死去,我們能夠確定毒藥分別在a、b其中。假設老鼠僅僅有一僅僅死去。我們能夠確定兩瓶毒藥在同一組裡
也就是說通過上訴方法,我們能夠確定毒藥編號的二進位制表示的第1位的狀況(都是1,都是0。各自是0、1)
這種方法是否能確定第2位的狀態呢?
答案是能。
可是存在乙個問題。
假設第1位各自是0、1,第2位也各自是0、1,那麼這兩個瓶的編號是00、11,還是01、10呢?
怎樣解決問題呢?
假設我們知道兩瓶毒藥的編號的第1位是不同的
比如:a: 000 001 010 011
b: 100 101 110 111
毒藥1在a組,毒藥2在b組,那麼這個問題就變成了尋找一瓶毒藥的問題。針對n=8的情況,我們能夠再使用2對老鼠就能找到兩瓶毒藥的編號。
假設我們有兩周試驗的機會。能夠第一周先用2對老鼠(為什麼是2對?)找到毒藥編號哪一位是不同的。
在知道哪一位不同以後。在第二週用2對老鼠得到兩瓶毒藥的其它位值。
也就是說我們能夠用2*log2(n/2)+2*log(n/2) 僅僅老鼠在兩輪試驗的情況下找到兩瓶毒藥
可是我們僅僅同意有1輪試驗時間,怎樣解決呢?
既然不能猜,我們就全押好了。
對於n=8的情況,兩瓶毒藥的編號,可能在1、2、3位不同。總是有一位不同,也有可能好幾位不同。
我們先押第1位不同。也就是兩瓶毒藥分別在a、b組其中:
a: 000 001 010 011
b: 100 101 110 111
用2對老鼠分別測試a、b組毒藥。
再押第2位不同,兩瓶毒藥分別在c、d組中:
c: 000 001 100 101
d: 010 011 110 111
也是用兩對老鼠
再押第3位不同。分別在e、f組:
e: 000 010 100 110
f: 001 011 101 111
那麼這樣測試的結果會怎樣呢?
如果兩瓶毒藥編號在第3位同樣。
比方是010, 100,那麼e、f兩組測試的結果是f組的老鼠所有存活下來。
假設是011。 111。那麼e、f兩組的測試結果是e組的老鼠所有存活。
所以第3位不同樣的如果是不成立的。
也就是說哪一位假設是同樣的,針對那一位做的實驗會出現一組其中所有存活的情況。因此這兩組針對這一位的實驗是無效的。
假設兩瓶毒藥在第1位是不同的。
比如毒藥編號是011、100,那麼a、b組其中都會出現死亡,那麼第1位不同的如果是成立的,我們能夠得到各個位的值。
綜上所述在推測某一位不同一時候,我們須要2*log(n/2)僅僅老鼠;要押中全部位的話,我們須要log(n)*2*log(n/2)僅僅老鼠。
也就是說。假設n=1000。有兩瓶毒藥。
用上述方法。我們須要(10*2*9)180僅僅老鼠,才幹找出毒藥編號。
離我們的下界19有些遠。
老鼠毒藥問題
問題1 1000瓶水中有 1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在一周之內找出是哪一瓶水有毒?微軟筆試題 解析 假設有 n只老鼠,則瓶數的上限n 2 n 將瓶子的 10進製編號 0 n 1 改為n位的2進製碼,然後 從左到右 讓第1只老鼠喝所有 編號的2 進製碼中...
老鼠與毒藥問題
偶然在社群上看到這個問題,看到了程式設計師的回答,饒有興趣,於是查詢了csdn後,終於看懂了。有1000瓶液體 正常,無毒 但是由於工作人員失誤,將毒藥滴到了其中一瓶中,從外觀和氣味上完全無法分辨出哪乙個是被汙染過的,我們只知道這個毒藥的毒發期是7天,實驗室有10只小白鼠,只有7天的時間,如何實驗才...
老鼠與毒藥問題
大家應該都聽說過這個老題目 有 1000 個一模一樣的瓶子,其中有 999 瓶是普通的水,有一瓶是毒藥。任何喝下毒藥的生物都會在一星期之後死亡。現在,你只有 10 只小白鼠和一星期的時間,如何檢驗出哪個瓶子裡有毒藥?這個問題的答案也堪稱經典 把瓶子從 0 到 999 依次編號,然後全部轉換為 10 ...