天平稱小球問題

2021-09-30 02:13:17 字數 2029 閱讀 3439

天平稱小球問題

天平稱小球問題有很多經典的正規化解法,在這裡我們談論著只是其中最為廣泛應用的一種——三進製編碼解法。

為什麼想起了使用三進製?其實很好理解。讓我們考慮一下小球的狀態,有:沒放在天平上、在天平左盤、在天平右盤三種。我們不妨用一些數碼來表示這三種狀態:

0——沒放在天平上

1——放在天平左盤

2——放在天平右盤

這樣,我們就可以用乙個數碼串來表示某個小球被稱量的過程,比如某個小球的編碼是210120,就表明這個小球,第一次稱量在右盤,第二次在左盤,第三次不在天平上,第四次在左盤,第五次在右盤,第六次不在天平上。很簡單吧,僅僅用乙個數碼串就把小球複雜的稱量過程表示出來了。

為了方便說明,下面都以「12小球稱3次」來描述這個問題,不過,你很容易就能夠推廣到「m個小球稱n次的情形」。好,閒言少敘,書歸正傳。

假設我們已經把12個小球編上不重複的3進製編碼,稱量的時候我們完全按照編碼操作,第0步,我們把12個小球上的編碼第0位為1的放在天平左邊,編碼第0位為2的放在天平的右邊,編碼第0位為0的則不放在天平上,記下稱量結果;第1步,我們把12個小球上的編碼第1位為1的放在天平左邊,編碼第1位為2的放在天平的右邊,編碼第0位為1的不放在天平上,記下稱量結果;如此下去,編碼有n位,我們就稱量n次,得到n組結果。

考察一下結果的狀態:天平平衡、天平左邊輕於右邊、天平左邊重於右邊。咦?怎麼也是3種。(hia hia,無巧不成書嘛,好戲還在後面)我們用0來表示天平平衡,用1天平左邊輕於右邊,用2天平左邊重於右邊;這樣,稱量了n次,我們就得到了乙個n位的結果編碼,它也是三進製編碼。注意:這個編碼有可能和某個小球的編碼相同呢!:)

你似乎隱隱約約已經意識到了什麼了吧。好,現在就把問題挑明:得到的結果編碼,和非標準小球的編碼一樣,或者有直接的對應關係。(這個關係是什麼?往下看)

如果我們確定了一組小球的稱量方法(對應於12個小球的3進製編碼),現在反過來考慮,原來某一步放天平左盤的小球現在放在天平右盤,原來放天平左盤的小球現在放在天平右盤,原來沒放在天平上的小球應然不放在天平上。那麼這樣得到的小球編碼(也是12個)和原來的重複嗎?顯然不重複,我們把由這種對應關係得到的編碼叫做對偶碼(這裡下個定義:把編碼中的每一位數碼,1換成2,2換成1,0不變,得到新編碼叫做原編碼的對偶碼。如22102的對偶碼是11201,或者說22101和11201互為對偶碼)。這時候,你會考慮這樣乙個問題了——3位的3進製編碼有多少個?答案是有3^3=27個(記做3^n),比上面提到的24個編碼還多3個。為什麼要研究這個對稱碼?因為我們把a,b,c,d球放在左盤,把a』,b』,c』,d『球放到右盤——與我們把a』,b』,c』,d『球放在左盤,把a,b,c,d球放到右盤,其稱量意義是一樣的,得到結果是一樣的,我們要避免這種重複操作。所以說,實現這種演算法,很重要的一點是選碼——在互為一對對偶碼的編碼中選擇乙個來給小球編號。

到這裡,我想你一定猜出來了——27比上面的24個編碼多出的3個是什麼碼?他們是000,111,222。000和自身為對偶碼,111和222互為對偶碼。為什麼要去掉他們3個?我想還是不放在這裡說明了,要解決這個問題你得看看後面的數學證明先!

下面說說程式實現編碼的具體過程。

參考上圖,我們首先取得用乙個code陣列來存放編碼,為了節省空間,在我的程式裡code陣列存放的是十進位制編碼,我用gettheball.num2code()和gettheball.code2num()來實現三進製和十進位制之間的相互轉換。我們首先把編碼全部存入陣列,然後去掉000,111,222這三個編碼,然後再剩餘的編碼中再刪掉一半,得到的12個編碼標記給小球就行了。對於1開頭的編碼我們選擇的是比111大的所有編碼,對於2開頭的編碼,我們劃去「1開頭我們選的那部分編碼」的對偶碼,對於0開頭的編碼,我們選擇的是從左向右的編碼位中,第乙個不為0的數碼是1的編碼(此處酷似好難理解,其實第乙個不為0的數碼不是1就是2,我們刪掉了是2的那一半)。

好了,數數看,看好刪了一半剩了一半。按照上圖的編碼方式,經過操作得到的結果碼,如果在小球編碼中,那個編碼的小球就是非標準球,且比標準球輕。如果結果碼不在小球編碼中,那麼結果碼是非標準球的對偶碼,非標準球比標準球重。

好了,講到這裡就告一段落了。其實,要想領會透徹這個演算法的含義,為什麼要這麼編碼,這麼編碼為什麼正確,還必須經過嚴格的數學證明才行。

相關的數學證明

天平稱球問題

筆試題目碰到了天平稱球的問題,之前遇到沒有細細的查閱資料,再次筆試的時候就吃虧了,這裡記錄下結論 現有n個小球,其中有乙個壞球不知比標準球輕還是重。我們令h 1 要保證在n個球中找出壞球並知道其輕重,至少需要稱h次。假設n 2,我們有 2 如果n 3h 1 2,那麼稱h次就足夠了 3 如果n 3h ...

天平稱球問題

筆試題目碰到了天平稱球的問題,之前遇到沒有細細的查閱資料,再次筆試的時候就吃虧了,這裡記錄下結論 現有n個小球,其中有乙個壞球不知比標準球輕還是重。我們令h 1 要保證在n個球中找出壞球並知道其輕重,至少需要稱h次。假設n 2,我們有 2 如果n 3h 1 2,那麼稱h次就足夠了 3 如果n 3h ...

巧用進製解決天平稱問題《演算法很美》

用天平稱重時,我們希望佣金可能少的砝碼組合稱出盡可能多的重量。如果有無限個砝碼,但它們的重量分別是1,3,9,27,81,等3的指數冪神奇之處在於用它們的組合可以稱出任意整數重量 砝碼允許放在左右兩個盤中 本題目要求程式設計實現 對使用者給定的重量,給出砝碼組合方案,重量 1000000。例如 使用...