減治法解決假幣問題
識別假幣問題:在n枚外觀相同的假幣中,有一枚是假幣。在一架天平上,我們可以比較任意兩組假幣。也就是說,通過觀察天平是向右傾、向左傾還是停在當中,我們可以判斷出兩組硬幣重量是否相同,或者哪一組比另一組更重,但是我們不知道重多少。問題是:設計一種有效的演算法來檢測出這枚假幣。
簡化版本:已知假幣相對真幣較輕或者較重;
普通版本:不知道假幣輕還是重
除了每次把硬幣分為2份的辦法,還可以用更加高效的把硬幣分為三堆,每堆n/3個硬幣,在比較了兩堆硬幣的重量之後我們可以把例項的規模小區一個因子3. 相應的,我們可以期望稱重的次數大約會是log3 n
設計一種可以處理任何是或不是3的倍數個硬幣的演算法
虛擬碼如下:
每次平均分三堆的結果可能有:餘數0 餘數1 餘數2
如果餘數0:
平均分,任選兩堆(堆1+堆2)比較,
如果平衡:
堆3含假幣;
如果不平衡:
比較堆1和堆3,
如果平衡:
堆2含假幣,
如果不平衡:
堆1含假幣;
餘數1:
平均分後得到3堆+1個硬幣,任選兩堆(堆1+堆2)比較,
如果平衡:
比較堆1和堆3,
如果平衡:
剩餘的單個硬幣為假,
如果不平衡:
堆3為含假幣的堆
如果不平衡:
比較堆1和堆3,
如果平衡:
堆2含假幣
如果不平衡:
堆1含假幣
餘數2:
平均分後得到3堆+1個硬幣,任選兩堆(堆1+堆2)比較,
如果平衡:
比較堆1和堆3
如果平衡:
假幣在兩個單個硬幣中,這兩個硬幣必然是不平衡的,這時從堆中找出任意一枚硬幣,從兩個單個硬幣中拿出硬幣1進行比較
如果平衡
假幣為幣2
如果不平衡
假幣為幣1
如果不平衡:
堆3為含假幣的堆
如果不平衡:
比較堆1和堆3
如果平衡:
堆2含假幣
如果不平衡:
堆1含假幣
分為堆1,堆2,堆3,餘數k
如果堆123數目為0
if k=0
if k=1
if k=2
Else
if 堆1和堆2平衡:
if 堆1和堆3平衡,
findOutFake(k)
else
findOutFake(堆3)
else:
if 堆1和堆3平衡,
findOutFake(堆2)
else
findOutFake(堆1)
相關文章
- 消除假確定性並解決實際問題
- 決策樹減支問題(優化)dfs減支問題優化
- 跨域問題解決辦法跨域
- svn相關問題解決辦法
- 解決ASM無法啟動問題ASM
- 解決無法使用VI的問題
- JS 加減乘除 尤其是減法精度問題JS
- 解決Centos無法yum源的問題CentOS
- 解決split無法得到空字串問題字串
- 回溯法解決全排列問題總結
- Parallels Tools 無法安裝問題解決Parallel
- 解決codeblocks無法除錯的問題BloC除錯
- linux mint 19解決 輸入法問題Linux
- 解決寶塔皮膚無法訪問的問題?
- 解決 raw.githubusercontent.com 無法訪問的問題Github
- Macbook Pro Big Sur出問題解決辦法Mac
- Xshell連線Linux慢問題解決辦法Linux
- 前端inline元素間隙問題解決辦法前端inline
- 回溯法(排列樹)解決八(N)皇后問題
- 窮舉法解決0/1揹包問題——pythonPython
- 成功解決github無法顯示圖片問題Github
- AD18無法模擬問題的解決
- 使用PorterDuff解決clipPath無法抗鋸齒問題
- matlab編譯exe問題具體解決辦法Matlab編譯
- 比特幣ETF的決定可以解決華爾街“10億美元”問題比特幣
- Linux配置靜態IP解決無法訪問網路問題Linux
- 【Salesforce問題解決】Dataloader匯出的檔案亂碼或者問號的解決辦法Salesforce
- [解決問題] Vagrant nginx 站點配置問題(ThinkPHP HTML 無法調跳轉)NginxPHPHTML
- Linux Ubuntu 20.04 LTS 解決無法輸入中文 輸入法問題LinuxUbuntu
- 使用動態規劃完美解決硬幣找零問題(Python)動態規劃Python
- 記一次用油猴無法hook問題解決Hook
- 【PyCharm】解決虛擬環境pip無法使用問題PyCharm
- 解決 Python 指令碼無法生成結果的問題Python指令碼
- goland中npm無法使用的問題及解決方法GoLandNPM
- 解決idea中無法識別主類的問題Idea
- IDEA中Lombok無法生效的問題及解決方法IdeaLombok
- 解決修改element-ui樣式無法生效問題UI
- 使用二分法來解決的問題