有乙個12品脫(pint)的酒瓶,裡面裝滿葡萄酒,另有8品脫和5品脫的瓶子各乙個。問如何從中分出6品脫的酒出來?
傳說泊松年輕時成功解決了該問題,勾起了他對數學的興趣而投身數學研究,因此該問題被稱為泊松分酒問題。另外這個問題又被稱為分油問題啦,分水問題啦等等。
小學的時候在一本《十萬個問什麼——數學卷》中看到過這個問題,那本書直接給出了乙個解答過程,又沒說原理,看得我糊里糊塗。
一 . 解答過程
為了方便說明,將容量為12品脫,8品脫,5品脫瓶子分別稱為大瓶子,中瓶子,小瓶子。按照下面2種規則中的如何一種可以解決這個問題:
第一套規則:
1. 大瓶子只能倒入中瓶子
2. 中瓶子只能倒入小瓶子
3. 小瓶子只能倒入大瓶子
4. 小瓶子只有在已經裝滿的情況下才能倒入大瓶子
5. 若小瓶子被倒空,則無論中瓶子是否滿,應馬上從中瓶子倒入小瓶子
之所以要規定倒酒的順序是為了防止狀態重複。而根據這5條規則,大瓶子每次倒入中瓶子的酒總是8品脫,小瓶子每次倒入大瓶子的酒總是5品脫。(請結合下面的表來理解這句話,理解這點很重要)
有了上面的規定後,倒酒的順序就確定下來了:
12品脫瓶子
8品脫瓶子
5品脫瓶子120
0初始狀態
48(倒進)04
35(倒出)93
0903
18(倒進)31
65(倒出)
搞到6品脫了66
0完成第二套規則:
1. 大瓶子只能倒入小瓶子
2. 小瓶子只能倒入中瓶子
3. 中瓶子只能倒入大瓶子
4. 中瓶子只有在已經裝滿的情況下才能倒入大瓶子
5. 若中瓶子被倒空,則無論小瓶子是否滿,應馬上將小瓶子倒入中瓶子
其實只是將第一套規則中的「中」和「小」兩個字對換了一下。
根據這個規則確定的倒酒的順序如下(注意,我將8品脫和5品脫的位置交換了一下):
12品脫瓶子
5品脫瓶子
8品脫瓶子120
075(倒進)07
0525(倒進)52
28(倒出)102
01022
55(倒進)25
0705(倒進)70
48(倒出)84
0804
35(倒進)43
18(倒出)111
01101
65(倒進)
1搞到6品脫了60
6完成好了試試用這兩種規則之一解決如下分酒問題吧:
大瓶子容量10,中瓶子容量7,小瓶子容量3,要分出來5
二. 原理
設大,中,小三個瓶子容量分別是c1,c2,c3,需要倒出的容量是r
則實際上要是我們能將容量為r的酒倒到中瓶子和小瓶子中就可以啦(有點廢話
設大瓶子倒滿中瓶子x次,從小瓶子中倒入大瓶子y次。
那麼顯然由大瓶子累次倒入中瓶子和小瓶子總共c2*x的酒。而由小瓶子倒入大瓶子一共有c3*y的酒。
那麼最終,小瓶子和中瓶子剩餘的酒顯然就是 c2*x - c3*y
因此,泊松分酒問題實質上轉化為下面的不定方程是否有正整數解的問題:
c2*x - c3*y = r
對於我們的問題,
c1=12,c2=8,c3=5,r=6
第一種倒酒規則實質上相當於解下面這個不定方程:
8x - 5y = 6 ( 限定 x > 0 ,y > 0 )
最小整數解是 x=2,y= 2
表示倒滿8品脫的瓶子2次,5品脫的瓶子倒空2次
那麼8品脫的瓶子和5品脫的瓶子剩酒總量必然是 8 * 2 – 5 * 2 = 6
第二種倒酒規則實質上相當於解下面的不定方程:
5x - 8y = 6 ( 限定 x > 0 , y > 0 )
最小整數解是 x = 6 ,y= 3
表示倒進5品脫瓶子6次,從8品脫瓶子中倒出3次
那麼最終5品脫和8品脫的瓶子剩酒總量必然是 5 * 6 – 8 * 3 = 6
好了,現在你明白為什麼要規定倒酒的順序了吧。小瓶子和中瓶子是乙個系統,而大瓶子又是另外乙個系統,大瓶子的酒只能倒入中瓶子和小瓶子組成的系統,小瓶子的酒只能倒出到大瓶子的系統。我們關注的是由中瓶子和小瓶子組成的系統,這個系統每次增加都是8品脫(中瓶子容量),每次減少都是5品脫(小瓶子容量)。
另外,如果存在x和y,使得下面的方程有解:
c2*x - c3*y = 1
實質上就是說能夠倒出1品脫的酒,那麼任意品脫的酒都能倒出了。
因為:(c2*x - c3*y)*n = n
**:
l = [12, 8, 5]
l = [12, 0, 0]
c = [lambda: l[1] == 0, lambda: l[1] != 0, lambda: l[2] == l[2]]
src = 0
while 6 not in l:
dst = (src + 1) % 3
if c[src]():
t = min(l[dst] - l[dst], l[src])
l[src] -= t
l[dst] += t
print l
src = dst
泊松分酒 15
題目內容 有3個容器,容量分別為12公升,8公升,5公升。其中12公升中裝滿油,另外兩個空著。要求你只用3個容器操作,最後使得某個容器中正好有6公升油。下面的列表是可能的操作狀態記錄 12,0,0 4,8,0 4,3,5 9,3,0 9,0,3 1,8,3 1,6,5 每行3個資料,分別表示12,8...
java實現分酒(泊松分酒)
寫在前面 泊松分酒 法國著名數學家波瓦松在青年時代研究過乙個有趣的數學問題 假設某人有12品脫的啤酒一瓶,想從中倒出六品脫,但是恰巧身邊沒有6品脫的容器,僅有乙個8品脫和乙個5品脫的容器,怎樣倒才能將啤酒分為兩個6品脫呢?現在,請你設計乙個程式,可以根據輸入的滿瓶容量 a 和兩個空瓶的容量 b和c ...
泊松分酒(深搜)
泊松是法國數學家 物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分布。有一次閒暇時,他提出過乙個有趣的問題,後稱為 泊松分酒 在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中流傳較多是 韓信走馬分油 問題。有3個容器,容量分別為1...