本文原發表於我在JavaEye的技術部落格。
流傳的題目很簡單,12個乒乓球(或金幣之類的)其中一個是次品,重量與其他球不一樣(但是不知是輕了還是重了),給一個天平,看幾次可以稱出來哪個球是壞球。
這個題目很久以前在大學的BBS上發表過解法,現在找不到了,重新寫一遍也不費勁。
實際上是可以稱14球的,下面是解法(設為A1-A14)。
注意,14球的前提是有多一個標準球A0。 否則只能稱13球。
A0-A4 vs A5-A9
如果相等,則壞球在A10-A14這5個球中。
5球(重新記做A1-A5外加一個A0為標準球)的稱法如下:
A0,A1 vs A2,A3
如果相等,則壞球是A4或A5,取其中一個與A0再稱一次即可判斷(這個不用說了,人人都知道怎麼稱)。
如果不等,假設A0,A1 > A2,A3(<的話,下面的判斷都反一反即可),則再稱一次:
A2 vs A3
如果相等,則壞球是A1,否則A1就是好球,壞球在A2、A3中,根據上一次稱量結果可以判斷出,壞球比標準球輕,所以A2 vs A3的結果,輕的那個就是壞球。
如果第一次稱量不等,則壞球在A1-A9這9個球中,並且你知道一個不等關係,我們假設是A0-A4 > A5-A9(<的話,下面的判斷都反一反即可)。
然後測A1,A2,A5 vs A3,A4,A6
如果相等,則壞球在A7,A8,A9中,並且可以推匯出其中輕的那個是壞球,再稱一次肯定能找出壞的那個。
如果A1,A2,A5 > A3,A4,A6
則壞球在A1,A2,A6中,並且可以推匯出A1,A2 > A0,A6
反之壞球在A5,A3,A4中,並且可以推匯出A5,A0 < A3,A4
不難看出這兩種情況實際是等價的,只需比較兩個同處一側的球就可以判斷哪個是壞球了。
如果沒有標準球A0的話,那第一次稱量就不能5對5了,只能4對4,所以最多隻能稱13個球。第一次相等的情況跟前面完全一樣,如果不等,就是那 8個球有問題,比前面的9個還少一個,所以你肯定可以稱出來。那麼為什麼常見的題目都是12球呢?估計最初流傳時很少有人真正從理論(資訊理論)上理解這個 題,所以答案都是湊出來的,自然很難做到最佳化。
但是如果掌握了理論,這個稱球問題就可以推廣,比如4次最多可以稱量27+14=41個。前提也是你多一個標準球,這樣第一次稱量就是14 vs 13+1,如果相等,壞球就在剩下的14個裡,就轉化為了前面描述的14球稱量問題。如果不等,則壞球在27個裡,通過合理調配,你肯定可以把它們區別成 3組分別9個,通過一次稱量判斷出壞球到底是在哪9個球中。因為一次稱量有3種狀態,可以把一堆球分成3組。以下每次都是3組1分,所以27=3的3次方 就是表示3次稱量就可以區分出來了。
不難看出,如果5次的話,可以最多稱量27*3+41=122個,以下可以逐級類推,有興趣的同志可以求出它的公式。
最後是一個思考題,既然可以3個一組分,為什麼3次稱量只能稱14個而不是27個呢?