趣味演算法之泊松分酒

2021-07-26 06:09:18 字數 2567 閱讀 4858

有乙個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...