十二硬幣問題

2021-10-02 18:55:43 字數 4229 閱讀 2548

解題思想源於「約翰·比斯利」(乙個歪果仁)

##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...