解題思想源於「約翰·比斯利」(乙個歪果仁)
##1、問題重述
給出12個硬幣,其中乙個是假硬幣,用乙個天平來確定三種重量的假幣(其中假幣可能比其他硬幣輕或重)。問:至少稱量多少次能夠保證判斷出:是否假幣,而且如果有,確定假幣是哪一顆,###3顆硬幣的情況
我們分析3顆硬幣的情況,是為了得出一種分類方法。
三枚硬幣測量如圖:
經過這兩次稱重之後,我們可以判斷三個資訊:
1、是否有假幣; 2、假幣是哪一顆; 3、假幣是輕還是重;這是三枚硬幣的情況,我們稱量兩次,即可得出上面三個結論。
###9枚硬幣的情況
根據三枚硬幣的情況,我們將9枚硬幣分為三組,
用類似與3枚硬幣的方法,兩次測量後,我們必然可以得到一下資訊(對比三枚硬幣情況)
1、是否有假幣; 2、假幣在哪一組; 3、假幣是輕還是重;如圖:
接下來我們要幹的事情,就是去確定:在已經判斷出有假幣的組中,確定假幣是哪一顆。
3枚硬幣,已經知道假幣是輕還是重,再通過一次稱量,我們就可以確定假幣是哪一顆。
如圖:
總結9枚硬幣的方法:
9枚硬幣,經過3次測量,我們可以獲得以下資訊:
1、有沒有假幣; 2、假幣是輕是重; 3、假幣是哪一顆;###12枚硬幣的情況
在9枚硬幣分成3個組的情況下,我們在每個組裡加入一枚新硬幣,進行第一次稱量,如圖:
在此基礎上,新加入的硬幣不換位置,交換9枚硬幣的位置,如圖:
我們可以得到以下資訊:
1、硬幣是在新加入的3顆中,還是在原來的9顆中(原來的9顆交換了位置,新加入的3顆沒有換位置)基於此,我們進行下面的判斷:
如果硬幣是在新加入的3顆中,按照3顆硬幣的方法,再稱量一次就可以找到假幣。基於此,我們可以得出結論:如果硬幣實在原來的9顆中,按照9顆硬幣的方法,再稱量一次也可以找到假幣。
如果三次都是平衡,判斷出沒有假幣。
12枚硬幣稱3次,必定可以找到假幣運用python**來實現12枚情況的輸出:
結果如下:
j ['z', 'z', 'p'] 假幣是重的
a ['z', 'p', 'z'] 假幣是重的
b ['z', 'p', 'y'] 假幣是重的
c ['z', 'p', 'p'] 假幣是重的
d ['y', 'z', 'z'] 假幣是重的
e ['y', 'z', 'y'] 假幣是重的
f ['y', 'z', 'p'] 假幣是重的
k ['y', 'y', 'z'] 假幣是重的
g ['p', 'y', 'z'] 假幣是重的
h ['p', 'y', 'y'] 假幣是重的
i ['p', 'y', 'p'] 假幣是重的
l ['p', 'p', 'y'] 假幣是重的
k ['z', 'z', 'y'] 假幣是輕的
e ['z', 'y', 'z'] 假幣是輕的
d ['z', 'y', 'y'] 假幣是輕的
f ['z', 'y', 'p'] 假幣是輕的
j ['y', 'y', 'p'] 假幣是輕的
b ['y', 'p', 'z'] 假幣是輕的
a ['y', 'p', 'y'] 假幣是輕的
c ['y', 'p', 'p'] 假幣是輕的
h ['p', 'z', 'z'] 假幣是輕的
g ['p', 'z', 'y'] 假幣是輕的
i ['p', 'z', 'p'] 假幣是輕的
l ['p', 'p', 'z'] 假幣是輕的
完畢!
下面是自家原產的python**
#假設z為左傾,y為右傾,p為平衡,球編號為a~l,situ為情況
#第一次
t1_left="abcj"
t1_right="defk"
t1_undo="ghil"
#第二次
t2_left="defj"
t2_right="ghik"
t2_undo="abcl"
#第三次
t3_left="adgk"
t3_right="behl"
t3_undo="cfij"
#整合t1=[t1_left,t1_right,t1_undo]
t2=[t2_left,t2_right,t2_undo]
t3=[t3_left,t3_right,t3_undo]#在矩陣中,0為左,1為右,2為平
nb=["z","y","p"]
for i1 in range(3):
cycle_situ=
situ1=t1[i1]
for i2 in range(3):
situ2=t2[i2]
for i3 in range(3):
situ3=t3[i3]
#判斷公共值
#開始判斷
for zi1 in situ1:
for zi2 in situ2:
if zi1==zi2:
for zi3 in situ3:
#遍歷三個situ中的字元,判斷公共值
if zi2==zi3:
#為輸出總的情況準備
#print(situ1,situ2,situ3)#可檢視成功後具體分組情況
print(zi3,cycle_situ,"假幣是重的")
cycle_situ=#清空資料
print("\n")#為了讓結果輸出的時候好看一點
#如果假幣為輕,與假幣為重不同之處在於,天平右傾,假幣在左,天平左傾假幣在右,故修改一些假幣為重的程式順序即可
#就只改下面三行
t1=[t1_right,t1_left,t1_undo]
t2=[t2_right,t2_left,t2_undo]
t3=[t3_right,t3_left,t3_undo]#在矩陣中,0為左,1為右,2為平
#完成取輕的一方的操作
nb=["z","y","p"]
all_situ=
for i1 in range(3):
cycle_situ=
situ1=t1[i1]
for i2 in range(3):
situ2=t2[i2]
for i3 in range(3):
situ3=t3[i3]
#判斷公共值
#開始判斷
for zi1 in situ1:
for zi2 in situ2:
if zi1==zi2:
for zi3 in situ3:
#遍歷三個situ中的字元,判斷公共值
if zi2==zi3:
#為輸出總的情況準備
#print(situ1,situ2,situ3)#可檢視成功後具體分組情況
print(zi3,cycle_situ,"假幣是輕的")
cycle_situ=
###豐豐豐豐豐豐
稱硬幣問題
稱硬幣問題算是經典問題了,很考驗邏輯能力,因此常出現在號稱智商160或智商180的題集中,現在有些企業招聘也喜歡問這種問題。稱硬幣的問題基本上形式類似,只是硬幣總個數有差別,形式為 有n枚硬幣,外觀無法區別,但是有一枚是假幣 可能告訴你是輕或重,也可能說不知道輕重 問用一無砝碼的天平,最少幾次稱出那...
最少硬幣問題
問題描述 有n種不同面值的硬幣,各硬幣面值存於陣列t 1 n 現用這些面值的錢來找錢 各面值的個數存在陣列num 1 n 中。程式設計任務 對於給定的1 n 10,硬幣面值陣列 各面值的個數及錢數m,0 m 2001,程式設計計算找錢m的最少硬幣數。input 第乙個數字n,後面n行每行兩個數,面值...
最少硬幣問題
本文內容遵從 cc版權協議 設有n 種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢。可以使用的各種面值的硬幣個數與面值分別存於陣列coin 1 n 和t 1 n 中。對任意錢數0 m 20001,設計乙個用最少硬幣找錢m的方法,對於給定的1 n 10,硬幣面值陣列t...