分油问题

韩信走马分油问题

分油问题 此博文包含图片 (2017-03-11 22:41:51)转载▼
标签: 数学问题
分油问题

在我国民间,早就相传有所谓“韩信分油问题”。

故事说,韩信骑马遇到两个路人争执不下。韩信得知,此二人有一个装满10斤的油篓,和两个容量分别为3斤、7斤的空油篓,希望可以平均分出两份,即每人获得每份的5斤油。因为没有找出解决问题的办法,所以两个人争执得脸红脖子粗。

聪明的韩信眉头一皱计上心来,提出了一个分油的方法,巧妙解决了问题。

韩信是怎么样解决问题的呢?

为了探讨解决问题的线索,我们还是先来看一个比较简单的打水问题吧。

一、打水问题
有一大一小两个桶,容量分别是9升与4升。问如何利用这两个桶,从河里打起6升的水来?

题目仅给出了两个容器,同时还隐含地给出了第三个容器——河。

0、问题的表述
设有两个水桶B与C,容量分别为b与c。需要打出水的容量为Q。

记河为容器A,容量为a。与有限的b、c相比,可以理解为 a = 无穷升。

显然在我们的题目里:a,b,c与Q均为正整数,而且a>b>Q>c>0。 (1)

为了表述的方便,我们把甲容器的水全部倒入乙容器的过程记为甲→乙。

在盲目尝试倒腾的实践中,我们发现仍然有一定的规律或者要求:

1)、由于容器没有刻度,倒油过程中,小容器总需要全部倒空或使另桶完全满;

2)、每个容器里可以容纳的容量≤该容器的最大容量。

3)、来回的倒腾是没有意义的。例如,在B、C两桶都为空的条件下:

——二者之间的来回:A→B,B→A;A→C,C→A;

——三者之间的来回:A→C,C→B,B→A 。

在这些倒腾之后,都没有出现异于a与b的新的容量,对于问题的解决徒劳无益。

有意义的倒腾,应当是规范的。规范的,意味着有序。

对打水的问题,有序意味着,始终按照一定的次序打水。我们从两桶皆空开始:

第一步,从河里打水,倒入两桶之一,使之满盈;

第二步,然后,将此桶水倒入另外一桶,如满则转第三步,否则返回第一步;

第三步,最后,将那桶满盈之水,倒入河里。

以下搜索的动作就是,按照上述三部曲的顺序,重复循环,直到某桶内水的容量达到要求的容量Q时就停止,称该过程经历的打水次数或者搜索的步数s为解。

因为桶有两个,所以这样子规范打水的过程,也有两种不同的方式,见图1。

分油问题

比较两种不同的打水方式,如果某个过程需要的步数s较小,则称该解为最优解。

下面来讨论解决打水问题的各种方法。

1、列表法
以表格的方式,依次标出规范的打水过程,最为方便。

分油问题

上表中用了恒等式:∞±有限数=∞。

从大小桶打水过程的步数依次为S=9,S =16。

2、网格坐标法
仔细研究表1、2发现,实际上起作用是B、C两桶内水容量的变化,而且这个变化就在不超过各自容量的整数点上。这就启发我们,可以用平面直角坐标系来记录问题的搜索途径。分油问题

在图2矩形方格四周,用逗号隔开的两数,分别代表该时刻大小桶内水的实际容量。左下角的“0,0”是原点,表示起初大小桶内都是空的。整个网格图形与平面直角坐标系对应。方格内的斜线,表示可能的搜索路线。

按照上述三部曲,搜索的过程是:

——从原点(0,0)出发,沿竖坐标到顶(0,4)。意思是:从河里打水4升到小桶;

——然后向框内折返到边界(4,0),意思是,把小桶的水全部倒入大桶;

——继续折返到边界(4,4),意思是,再次倒4升水到小桶,

…………

最后的箭头到达了目的地(6,0),即终于打出了6升的水。步数s=16。分油问题

图3示出了从大桶开始的过程,其步数s=9,也是最优解。

与列表法相比,网格坐标法的特点是:直观,形象;缺点是,事先画网格有点麻烦。

3、不定方程法
以上,从大桶开始的搜索过程(表2或图3)的最后结果是: 6=9-3。

追根溯源,发现这里的3=4-1。进一步追踪,发现其中的1=5-4。而5=9-4。

综合以上,可得要求的容量 Q=6=9-3=9-(4-1)=9-(4-(9-2×4))

分析从小桶开始的搜索过程(表1或者图2),也有类似的结果如下:

Q=6=4+2=4+(9-7)=4+(9-(4+3)) = …… = 4+(9-(-9-4×4)))

化简以上二式,可以得到相同的结果: 6=2×9-3×4。

代入式(1)后可得: 2×b-3×c = Q (2)

仔细查看表2(或者图3)发现,这里的:

   2=从河里为空大桶充满的次数;

   3=从满油小桶倒入河里的次数。

同样查看表1(或者图2)发现,这里的:

  2=把满油小桶倒入河里的次数;

  3=从河里为初始为空小桶充满的次数。

总结这两种情况可知,我们辛辛苦苦搜索出的2与3, 为河与大小桶交换水的次数。

因此,如果分别设x与y为河与大小桶交换水的次数:

——在这两个变量为正整数时,分别表示从河里打水充满空的大小桶;

——在这两个变量为负整数时,分别表示把大小桶里原来充满的水倒入河里。

则分水问题可以归结为一个不定方程: bx-cy=Q (3)

模型的物理意义是:大小桶系统与河水流量之间要保持平衡,即:

从河里打入大小桶里的流量= 从大小桶倒入河的流量 + 大小桶里剩余的流量

或者,

从河里打入大小桶里的流量-从大小桶倒入河的流量=大小桶里剩余的流量Q (4)

问题是:已知参数b,c,Q,问:河里与大小桶交换水的次数x与y分别是多少?

对这里的打水问题,代入三个参数到式(4)中,得不定方程: 9x-4y=6 (5)

用数论方法,易解出其通解为: x = 6 + 4t,y = 12 + 9t,t = 0 ,±1,±2,…… (6)

在这无穷个解里,符合题意仅两个,其参数为 t = -2,t = -1。.代入式(5)可得两组解:

x1 = -2,y1 = -6,对应于从小桶开始的分水过程,结果与表1,图2相符;

x2 = +2,y2 = +3,对应于从大桶开始的分水过程,结果与表2,图3相符。

不定方程的优点是,模型的形式简洁,求解方便。缺点是:因为仅考虑了从河里与大小桶系统容量的平衡,而没有关注在大小桶系统内部,大小桶之间的倒水过程,因此不能给出具体的分水过程,也无法得知,究竟需要多少次的倒腾,才可以获得要求的容量Q。

4、计算机编程法
如果把表,1与表2里的三组数据看成是三个数组,则可以很方便地把求解或者搜索的过程通过计算机程序,交由计算机来完成。

   包括打水问题,分油问题在内一些数值计算,属于计算机计算的递归算法,已经成为专业课程《数据结构》里的例题或者练习题。

   把容器A、B、C在不同搜索步骤(s)时水的容量,记录在三个数组A(s),B(s)与C(s)里。容器A、B、C的容量a,b,c与目标值Q均正整数,且 a>b>Q>c。

   以从大桶开始的搜索过程为例,计算机程序的步骤如下。

0º 准备(定义数据,赋初值,打印表头)

   定义整(数)型常数a=1000,b=9,c=4,Q=6

   定义整(数)型变量 i,j,s,delta

   定义整(数)型数组 A(100),B(100),C(100)

   i=0 :j=0:s=0:A(s)= a: B(s)= 0 : C(s)= 0

   打印表2的表名:“              打水问题搜索过程表”

   打印表2的表头线:“********************************************”

   打印表2的表头:“步数   A(河)   B桶(”;b;“升)   C桶(”;c;“升)”

   打印表2的表头线:“——————————————————————”

   打印表2第s行的内容:步数s,“∞”,B(s),C(s)

1º A→B(从河里打水灌满B桶)

   i=i+1:s=s+1 : A(s)= A(s)-b : B(s)= B(s)+b : C(s)= C (s)

   打印表2第s行的内容:步数s ,“∞”,B(s),C(s)

2º B→C(从B桶倒水到C桶)

   Delta=c-C(s):如果 B(s) ≥delta 则

   s=s+1:A(s)= A(s-1):B(s)=B(s-1)-delta:C(s)=C(s-1)+delta

   否则s=s+1:A(s)= A(s-1):B(s)=0:C(s)=C(s-1)+B(s-1)

   打印表2第s行的内容:步数s ,“∞”,B(s),C(s)

   如果 B(s)=0 则转1º

   如果 C(s)

3º C→A(把满桶的C桶水倒入河里)

   j=j+1:s=s+1

   A(s)= A(s)+c: B(s)= B(s-1): C(s)= 0

   否则A(s)= A(s): C(s)= B(s):B(s)=0

   打印表2第s行的内容:步数s,“∞”,B(s),C(s)

   如果A(s)≠B(s) 则转2º

4 º 打印搜索的结果

   打印表2的表底线:“——————————————————————”

   打印搜索结果:“通过S=”;s;“步的搜索,得到了需要的Q=”;Q

   打印搜索结果:“在搜索过程中”

   打印搜索结果:“从河水里为B桶倒入”,i,“次满桶的水”

   打印搜索结果:“先后”,j;“次把C桶满桶的水倒入河里。”

   打印表2的表底线:“********************************************”

   END



  在0 º中,a =1000,与三个数组ABC的维数100,都是预设一个相当大的数字。

  上述程序完全适合于从大桶开始的过程。

  对于从小桶开始的过程,只需要在0 º中交换a与b的赋值即可。

   另外,如果赋予a、b、c与Q其他数值,就可用于求解其他参数的分水问题。

   计算机编程方法,实际上是表格法的计算机实现。 

5、从大桶开始必然快吗?
前面的结果都表明:从大桶开始的过程步数,总是低于从小桶开始的步数。

    但是,这是否是一个必然的规律呢?

    我们准备用网格坐标法来全面考察,先从小桶开始。

     把问题修改为:现有容量方便为9升与4升的两只桶,问如何从河里打起各种Q升(Q=1,2,……9)的水?

    按题给条件,对容量 Q=4与Q=9的情况均可一步到位。故下只考虑容量Q =1,2,3,5,6,7,8的情况。

   我们在图2,3的基础上继续前进到底,使折线遍布整个网格图。每一段折线的箭头指向了各个不同的Q值。限于篇幅,具体的过程从略。

  根据这些结果,可得通过两种不同途径遍及各个流量Q需要的步数,列入表3。为简便计,表3中仅列出搜索过程折线在各个边框线上的坐标如下。

分油问题

结论是:

 对某4种Q,从大桶开始的步数少于从小桶开始的步数,大桶快一点点;

 对另3种Q,从大桶开始的步数大于从大桶开始的步数,小桶快一点点。

6、何时无解?
在以上多种方法的讨论中,解都存在,而且存在两种不同的解。

  问题是:对所有的问题(3):   bx-cy=Q   整数解都存在吗?                          

  在初等数论里,已经证明了:

  ——如果b与c互素,或者(b,c)=1,则必有整数解x与y存在;

   ——如果b与c有异于1的公因子,即(b,c)>1,则不存在整数解x与y。

   例如打水问题: 6x-3y=2,就没有整数解x与y。

二、韩信分油问题
有了以上讨论的准备,解决分油的问题就容易了。

  问题是:有装满10斤的油篓和两个3斤、7斤的空油篓。如何利用这三个容器分出两份每份5斤油。跟其他分油问题相同,这里的目标值(5)恰为两小篓(3,7)的平均。

  容易发现,分油问题与打水问题非常相似,都是通过在三个容器里的捣腾,获得需要的容量,区别在于容器A。在打水问题里,A是取之不尽用之不竭的河,而在分油问题里,A是装满10斤油的油篓。因此,解决分油问题的思路,要求与方法也基本上相同。

1、列表法
完全按照打水问题的列表法,分两种情况求解的过程见表4与表5。

分油问题

2、网格坐标法

   与打水问题不同,在分油问题里,有限容量的容器由两个增加到三个,但是没有必要把相应的网格坐标也由二维推广到三维。因为油的交换仍然主要在两个容量比较小的容器之间进行,所以二维的网格坐标仍然有效。以下,图4与图5依次给出分别从大桶小桶开始的搜搜过程。

分油问题

分油问题
3、不定方程法
相应的不定方程为 7x-3y=5 (7)
不定方程的意义仍然是:无论大篓的容量如何,输入输出中小篓系统的油量必须相等。
运用数论中的方法,容易解出方程的通解为:
x = 5+ 3t,y = 10 + 7t,t = 0 ,±1,±2,±3,±4,…… (8)
符合题意的参数是t = -2,与t = -1。将这两个t值代入式(9)可得两组解:
x1 = +2,y1 =+3,对应于从中篓开始的分油过程,结果与表4、图4相符;
x2 = -2,y2 = -4,对应于从小篓开始的分油过程,结果与表5、图5相符。
4、计算机编程法
与打水问题的区别在于,容器A的容量非无限了。因此,与前面几种方法的情况类似,核心的计算过程没有改变,需要修改的是一些细节。

0º 准备(定义数据,赋初值,打印表头)
定义整(数)型常数a=10,b=7,c=3,Q=5
定义整(数)型变量 i,j,s,delta
定义整(数)型数组 A(100),B(100),C(100)
i=0 :j=0:s=0:A(s)= a: B(s)= 0 : C(s)= 0
打印表格的表名:“ 分油问题搜索过程表”
打印表格的表头线:“********************************************”
打印表格的表头:“步数 A桶(”;a;“斤) B桶(”;b;“斤) C桶(”;c;“斤)”
打印表格的表头线:“——————————————————————”
打印表格第s行的内容:s ,A(s),B(s),C(s)

1º A→B(从A桶灌满B桶)
i=i+1:s=s+1 :A(s)= A(s)-b :B(s)= B(s)+b :C(s)= C (s)
打印表格第s行的内容:s ,A(s),B(s),C(s)

2º B→C(从B桶倒水到C桶)
Delta=c-C(s)
如果 B(s) ≥delta 则
s=s+1:A(s)= A(s-1):B(s)=B(s-1)-delta:C(s)=C(s-1)+delta
否则s=s+1:A(s)= A(s-1):B(s)=0:C(s)=C(s-1)+B(s-1)
打印表格第s行的内容:s ,A(s),B(s),C(s)
如果 B(s)=0 则转1º
如果 C(s)

3º C→A(把C桶满桶的水倒入A桶里)
j=j+1:s=s+1
A(s)= A(s)+c: B(s)= B(s-1): C(s)= 0
否则A(s)= A(s): C(s)= B(s):B(s)=0
打印表格第s行的内容:s ,A(s),B(s),C(s)
如果A(s)≠B(s) 则转2º

4 º 打印搜索的结果
打印表格的表底线:“——————————————————————”
打印搜索结果:“通过S=”;s;“步的搜索,得到了需要的Q=”;Q
打印搜索结果:“在搜索过程中”
打印搜索结果:“先后”;i;“次从A桶里为B桶倒入满桶的油”
打印搜索结果:“先后”;j;“次把C桶满桶的油倒入A桶。”
打印表格的表底线:“********************************************”
END

  上述程序既适合于从大桶开始的过程,也适合于从小桶开始的过程。
  区别在于,对不同b与c,赋予不同的数值。
  另外,如果为a、b、c与Q赋予其他的数值,就可用于求解其他参数的分油问题。

2017年3月12日于武

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值