ZZ泊松分酒问题
来源:互联网 发布:node npm init 编辑:程序博客网 时间:2024/05/22 14:29
怎么「分酒」
这个游戏的起源是一道趣味数学题,其中的内容如下:有位农夫到酒行,想买两袋5公升的酒。但是酒行里除了三个容积分别是10公升、7公升、3公升的量酒杯之外,没有任何测量工具。酒行老板如何运用这3个量杯,倒出两个5公升的酒呢?
为了方便说明,下面先定义几个名词:
甲:酒行里最大的量酒杯,在范例题的容量为10公升。
乙:酒行里第二大的量酒杯,在范例题的容量为7公升。
丙:酒行里最小的量酒杯,在范例题的容量为3公升。
丁:酒行老板想要倒出酒量,在范例题为5公升的酒。
为了深入了解这个游戏,我们将以下列方式来深究这个游戏:
(一) 这个游戏是不是有固定的解题策略?
(二) 如何判断指定的甲、乙、丙量杯组合,是否可将甲的酒量分半?
(三) 怎样的量杯组合,可以倒出任意的指定量来?
一、固定的解题策略:
一般人第一次接触本游戏,应该不会马上动手就倒,而会做下面的考虑:
(一)乙=丁或丙=丁时:此时仅需将甲量杯的酒,倒入乙或丙量杯,即可完成。
(二)甲–乙=丁或甲–丙=丁时:此时仅需将甲量杯的酒,倒入乙或丙量杯,即可完成。
(三)甲–乙–丙=丁时:此时仅需将甲量杯的酒,倒入乙和丙量杯,即可完成。
(四)当丙=1时,不断的重复将甲量杯的酒倒入丙量杯,再将丙量杯的酒倒入乙量杯,终究可倒出丙来。
(五)甲+乙–丙=丁时:此时需将甲量杯的酒,倒入丙量杯,再将丙量杯的酒倒入乙量杯,最后把乙量杯的酒,倒入甲量杯,即可完成。
(六)甲–乙+丙=丁时:此时需将甲量杯的酒,倒入乙量杯,再将乙量杯的酒倒入丙量杯,最后把丙量杯的酒,倒入甲量杯,即可完成。
但是会被出来考人的题目,岂能那么简单就被解出来,以范例题来说,必须要倒来倒去达8个步骤,如果不实际动手倒倒看,或以笔记录推导倒酒的过程,很难推算出来。所以如果没有一个有规则的策略,很可能东倒西倒,多出许多不必要的动作,所以我们对于「任意的指定量,是否能找到一个固定的策略,只要循此规则操作,必可得到所要的结果」有了兴趣。
以下先从范例题,来推导可能的解题策略:
(一)解法1:
甲
(10)
乙
(7)
丙
(3)
操作说明
(0)
10
0
0
各量杯起始的量
(1)
3
7
0
先用甲量杯的酒,把乙量杯倒满,
甲量杯余3公升,乙量杯被倒满为7公升。
(2)
3
4
3
用乙量杯中的酒,把丙量杯倒满,
乙量杯余4公升,丙量杯被倒满为3公升。
(3)
6
4
0
把丙量杯中的酒,倒回甲量杯,
甲量杯增为6公升,丙量杯为0公升。
(4)
6
1
3
用乙量杯中的酒,把丙量杯倒满,
乙量杯余1公升,丙量杯被倒满为3公升。
(5)
9
1
0
把丙量杯中的酒,倒回甲量杯,
甲量杯增为9公升,丙量杯为0公升。
(6)
9
0
1
把乙量杯中余下的1公升酒,倒入丙量杯,
乙量杯剩0公升,丙量杯为1公升。
(7)
2
7
1
用甲量杯中的酒,把乙量杯倒满,
甲量杯余2公升,乙量杯被倒满为7公升。
(8)
2
5
3
用乙量杯中的酒,把丙量杯倒满,因为丙量杯已有1公升酒,所以乙量杯只用去2公升,剩下5公升,操作至此,已完成题目的要求,量出5公升的酒了。
(二)解法2:
甲
(10)
乙
(7)
丙
(3)
操作说明
(0)
10
0
0
各量杯起始的量
(1)
7
0
3
先用甲量杯的酒,把丙量杯倒满,
甲量杯余7公升,丙量杯被倒满为3公升。
(2)
7
3
0
把丙量杯中的酒,倒至乙量杯,
乙量杯增为3公升,丙量杯为0公升。
(3)
4
3
3
用甲量杯的酒,把丙量杯倒满,
甲量杯余4公升,丙量杯被倒满为3公升。
(4)
4
6
0
把丙量杯中的酒,倒至乙量杯,
乙量杯增为6公升,丙量杯为0公升。
(5)
1
6
3
用甲量杯的酒,把丙量杯倒满,
甲量杯余1公升,丙量杯被倒满为3公升。
(6)
1
7
2
把丙量杯中的酒,倒至乙量杯,
因为乙量杯已有6公升,所以只用掉1公升,此时乙量杯被倒满为7公升,丙量杯余2公升。
(7)
8
0
2
把乙量杯的酒,倒至甲量杯,
甲量杯增为8公升,乙量杯为0公升。
(8)
8
2
0
把丙量杯中的酒,倒至乙量杯,
乙量杯增为2公升,丙量杯为0公升。
(9)
5
2
3
用甲量杯的酒,把丙量杯倒满,操作至此,
甲量杯恰余5公升,完成题目的要求,量出5公升的酒了。
(三)经研究分析之后,我们发现有两种策略可完成倒酒任务:
方法1:以乙量杯为主:
操作(1):将甲量杯的酒倒入乙量杯。
操作(2):将乙量杯的酒倒入丙量杯。
操作(3):如果乙量杯中已没酒了,直接回到操作(1)。
如果乙量杯中还有酒,且丙量杯也已倒满酒,那就先将丙量杯的酒倒回甲量杯,然后回到操作(2)继续操作。
方法2:以丙量杯为主(过程同方法1,但乙、丙互易):
操作(1):将甲量杯的酒倒入丙量杯。
操作(2):将丙量杯的酒倒入乙量杯。
操作(3):如果丙量杯中已没酒了,直接回到操作(1)。
如果丙量杯中还有酒,且乙量杯也已倒满酒,那就先将乙量杯的酒倒回甲量杯,然后回到操作(2)继续操作。
二、以不定方程式来探讨是否可将酒分成两半
在范例题中,我们发现老板要分的酒,是将甲分为两半,亦即丁为甲的一半。类似的问题,我们可以使用「不定方程式」,来了解要求这样把酒分半的问题是「有解」,抑或「无解」!
(范例题)
以范例题为例,我们可假设老板将酒倒进7公升的量杯x次;酒由7公升量杯倒进3公升的量杯y次,因为最后7公升量杯内装5公升酒,所以7x-3y=5。
,
设,且t是正整数。
x=3t-1,
y=2(3t-1)-2+t=7t-4。
所以。
若取t=1,
则x=2、y=3;也就是说在倒酒的过程中,老板将酒倒进7公升的量杯2次,由7公升量杯倒进3公升的量杯3次,就可以完成老板和农夫的需求,倒出5公升的酒。
如果以(甲,乙,丙)表示容积10公升、7公升、3公升量杯内酒的容量,则过程是(10,0,0)→(3,7,0)→(3,4,3)→(6,4,0)→(6,1,3)→(9,1,0)→(9,0,1)→(2,7,1)→(2,5,3)→(5,5,0)
(范例二)
如果量杯的容积分别是10公升、7公升、4公升,假设老板将酒倒进7公升的量杯x次;酒由7公升量杯倒进4公升的量杯y次,得7x-4y=5。
取,且t是正整数。
则、
若取t=2
则x=3、y=4;也就是说在倒酒的过程中,老板将酒倒进7公升的量杯3次;酒由7公升量杯倒进4公升的量杯4次,即可完成老板和农夫的需求,倒出5公升的酒。
(10,0,0)→(3,7,0)→(3,3,4)→(7,3,0)→(7,0,3)→(0,7,3)→(0,6,4)→(4,6,0)→(4,2,4)→(8,2,0)→(8,0,2)→(1,7,2)→(1,5,4)→(5,5,0)
(范例三)
如果量杯的容积分别是10公升、6公升、4公升,假设老板将酒倒进6公升的量杯x次;酒由6公升量杯倒进4公升的量杯y次,得6x-4y=5。
取,且t是正整数。
则、
由上述方程式得知,因为t为正整数,所以得出x,y不是正整数,这和假设不符,表示本题无解。
另:6x及4y都是偶数,其差也必为偶数,所以不可能得到指定的酒量5公升。
(范例四)
如果量杯的容积分别是10公升、8公升、2公升,假设老板将酒倒进8公升的量杯x次;酒由8公升量杯倒进2公升的量杯y次,得8x-2y=5。
取t=4x,且t是正整数。
则、
由上述方程式得知,t若为正整数,则x,y没有正整数解。
另:8x及2y都是偶数,其差也必为偶数,所以不可能得到指定的酒量5公升。
结语:当我们以不定方程式求解甲量杯的酒量是否可分半时:
1. 若(乙,丙)=m(表示乙和丙的最大公因子为m),且m是丁的因子,则表示不定方程式有整数解,也就是分酒问题是有解的。
例如范例一(7,3)=1,1是5的因子,因此分酒问题是有解的;
范例二(7,4)=1,1是5的因子,因此分酒问题是有解的;
2. 若(乙,丙)=m,且m不是丁的因子,则表示不定方程式没有整数解,也就是分酒问题是无解的。
例如范例三(6,4)=2,2不是5的因子,因此分酒问题是无解的;
范例四(8,2)=2,2不是5的因子,因此分酒问题是无解的;
注:以上的推导过程已假设甲是偶数(因为要分半)及乙>丁,且只考虑倒出的指定量是产生在乙量杯中。如果甲不为偶数,倒出的指定量也不是甲的一半时,丁酒量可能会产生在甲量杯中,此时请自行类推。
三、怎样的量杯组合,可以倒出任意的指定量来?
由上面的推导,我们已知道有些量杯的组合不能将甲酒量分半,有些则可以。那么更进一步:「怎样的量杯组合,才可以分出任意指定量的酒」? (假设要求倒出的酒量必须产生在三个量杯之一,不得两杯合起来算)经我们的归纳,有以下的结论:
(一) 当(乙,丙)=1且乙+丙-2≦甲≦2×乙+丙+1时,
可使用这三种量酒杯,调出1~甲的所有量。
例如:在{10,5,3}的组合中,
(乙,丙)=(5,3)=1,6≦乙+丙-2≦甲=10≦2×乙+丙+1=14
(10,0,0)→(5,5,0)→(5,2,3)→(8,2,0)→(8,0,2)→(3,5,2)→(3,4,3)→(6,4,0)→ (6,1,3)→(9,1,0)→(9,0,1)→(4,5,1)→(4,3,3)→(7,3,0)→(7,0,3)→(2,5,3)→(5,5,0)
可调出1~10的所有容量来。
例如:在{8,5,2}的组合中,
(乙,丙)=(5,2)=1,5≦乙+丙-2≦甲=8≦2×乙+丙+1=13
(8,0,0)→(3,5,0)→(3,3,2)→(5,3,0)→(5,1,2)→(7,1,0)→(7,0,1)→(2,5,1)→ (2,4,2)→(4,4,0)→(4,2,2)→(6,2,0)→(3,5,0)→(3,3,2)→(5,3,0)→(5,1,2)
可调出1~8的所有容量来。
例如:在{10,7,3}的组合中,
(乙,丙)=(7,3)=1,8≦乙+丙-2≦甲=10≦2×乙+丙+1=18
(10,0,0)→(3,7,0)→(3,4,3)→(6,4,0)→(6,1,3)→(9,1,0)→(9,0,1)→(2,7,1)→ (2,5,3)→(5,5,0)→(5,2,3)→(8,2,0)
可调出1~10的所有容量来。
例如:在{8,3,2}的组合中,
(乙,丙)=(3,2)=1,3≦乙+丙-2≦甲=8≦2×乙+丙+1=9
(8,0,0)→(3,5,0)→(3,2,3)→(6,2,0)→(6,0,2)→(1,5,2)→(1,4,3)→(4,4,0)→ (4,1,3)→(7,1,0)
可调出1~8的所有容量来。
例如:在{10,3,2}的组合中,
(乙,丙)=(3,2)=1,因为甲=10>2×乙+丙+1=9
(10,0,0)→(7,3,0)→(7,1,2)→(9,1,0)→(9,0,1)→(6,3,1)→(6,2,2)→(8,2,0)→ (8,0,2)→(5,3,2)
可调出1,2,3,5,6,7,8,9,10公升的容量,但倒不出4来。
例如:在{8,6,5}的组合中,
(乙,丙)=(6,5)=1,因为甲=8<乙+丙-2=9
(8,0,0)→(2,6,0)→(2,1,5)→(7,1,0)→(7,0,1)→(1,6,1)→(1,2,5)→(6,2,0)→ (6,0,2)→(0,6,2)→(0,3,5)→(5,3,0)→(5,0,3)→(0,5,3)→(0,3,5)
可调出1,2,3,5,6,7,8公升的容量,但倒不出4来。
(二) 当 (乙,丙)=2且甲=乙+丙-1或乙+丙-3时
可使用这三种量酒杯,调出1~甲的所有量。
例如:在{13,8,6}的组合中,
(乙,丙)=(8,6)=2,甲=13=乙+丙-1
(13,0,0)→(5,8,0)→(5,2,6)→(11,2,0)→(11,0,2)→(3,8,2)→(3,4,6)→(9,4,0)→(9,0,4)→(1,8,4)→(1,6,6)→(7,6,0)→(7,0,6)→(0,7,6)→(6,7,0)→(6,1,6)→(12,1,0)→(12,0,1)→(4,8,1)→(4,3,6)→(10,3,0)→(10,0,3)→(2,8,3)→(2,5,6)→(8,5,0)→(8,0,5)→(0,8,5)→(0,7,6)
可调出1~13的所有容量来。
例如:在{11,8,6}的组合中,
(乙,丙)=(8,6)=2,甲=11=乙+丙-3
(11,0,0)→(3,8,0)→(3,2,6)→(9,2,0)→(9,0,2)→(1,8,2)→(1,4,6)→(7,4,0)→ (7,0,4)→(0,7,4)→(0,5,6)→(6,5,0)→(6,0,5)→(0,6,5)→(0,5,6)
(0,7,4)→(4,7,0)→(4,1,6)→(10,1,0)
可调出1~11的所有容量来。
例如:在{12,8,6}的组合中,
(乙,丙)=(8,6)=2,甲=12≠乙+丙-1=13或乙+丙-3=11
(12,0,0)→(4,8,0)→(4,2,6)→(10,2,0)→(10,0,2)→(2,8,2)→(2,4,6)→(8,4,0)→ (8,0,4)→(0,8,4)→(0,6,6)→(6,6,0)→(6,0,6)→(0,6,6)
可调出偶数的量而调不出奇数的量。
例如:在{9,4,2}的组合中,
(乙,丙)=(4,2)=2,甲=9≠乙+丙-1=5或乙+丙-3=3
(9,0,0)→(5,4,0)→(5,2,2)→(7,2,0)→(7,0,2)→(3,4,2)→(5,4,0)
调不出1,6,8的量来。
四、结语:
(一)、这个游戏的一般出题将甲酒量分半,可以套用固定的解题策略。
(二)、判断指定的甲、乙、丙量杯组合,是否可将甲的酒量分半出丁的方法是:判断乙丙的最大公因素是否为丁的因素,若为因素则可,反之为否。
(三)、下面的量杯组合,可以倒出任意的指定量来,否则不行:
1、当(乙,丙)=1且乙+丙-2≦甲≦2×乙+丙+1。
2、当 (乙,丙)=2且甲=乙+丙-1或乙+丙-3。
- ZZ泊松分酒问题
- ZZ泊松分酒问题 收藏
- C++问题集(ZZ)
- 面试j2ee问题 (zz)
- [ZZ] 空指针问题
- 内存对齐问题 zz
- 人生八大致命问题[zz]
- 汉字问题深入谈[zz]
- 面试java问题 1 (zz)
- 面试java问题 2 (zz)
- 问题研究 --字符集编码 (zz)
- ZZ stringstream的内存问题
- zz
- zz
- ZZ
- zz
- [zz]
- zz
- 初入ASM
- 【算法总结】垃圾收集算法
- 堆与栈的区别
- 在嵌入式系统中使用ActiveX控件的疑问
- 高斯背景建模学习 icvUpdatePartialWindow()
- ZZ泊松分酒问题
- 数据库正在恢复
- BS关于模板,对新手的三点建议:
- 让驱动自己被加载
- Delphi获取程序自身路径
- Delphi里去掉字符串中空格的函数
- 函数调用方式总结
- 更新库存数据,先进先出存储过程
- MySQL实用命令