倒水问题(算法挑战)
我想我们都做过这么一道题:有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。可以进行的操作是:把一个容器灌满;把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。问是否能够通过有限次操作,使得
我想我们都做过这么一道题:
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。
我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。
可以进行的操作是:
把一个容器灌满;
把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。
问是否能够通过有限次操作,使得水缸最后恰好有C升水。
输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000
输出:true或false,表示能否达到要求。
例如:
5升水、4升水的杯子、倒出3升水。做法有很多。其中一个 4-(5-4);解释:将4升杯装满导入空的5升杯中。再将4升杯装满倒置入5升杯中、使之装满!此时4升杯中剩余3升!
问题补充:
判断出可以得到C升水之后、要求列出操作次数最少的一组方法?
您的投票让 灵剑2012 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
倒水的过程有以下几种:设容器中剩余水量为x,A>B,则将水倒入B直至B满:x=>x-B;从B倒入满满一容器的水:x=>x+B;将A倒满水然后倒入B直至B满:x=>A-(B-x)即x=>x+A-B;将B倒满水然后倒入A直至A满:x=>B-(A-x)即x=>x-(A-B)。因此能倒出的水的容量一定能写成X = mA + nB,因此X应当是gcd(A,B)的倍数。
反过来,如果X是gcd(A,B)的倍数,则一定存在m,n使得mA + n(A-B) = X,当X<lcd(A,B)时m和n是唯一的。根据m和n的值可以推算出倒水的方案。
-
0 支持谢灵哥,意思大致明白!代码还是写不出来!糗了! – thanks丶墨 2013-09-05
-
0 支持@thanks丶墨 计算出对应的m和n的过程是一个经典的辗转相除算法,通常叫做扩展的欧几里得辗转相除,可以查一下数论的相关内容。倒水的方案的要点在于倒的过程必须保证0<=x<=A,因此需要把C拆成m*A+n*B+x,x符合0<=x<=A,是最后一次要调整的水量。要求出最少步骤还是有一些难度的。 – 灵剑2012 2013-09-05
-
0 支持@灵剑2012 嗯。欧几里得辗转相除我了解。我也觉得求出最少步骤很困难! – thanks丶墨 2013-09-05
您的投票让 thanks丶墨 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
您的投票让 假行僧 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
您的投票让 lxgwm2008 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
您的投票让 chen_an_2005 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
您的投票让 奇幻空间 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
您的投票让 箫筱沐羽 声誉值增加了10分。
支持投票,不仅能让回答用户获得声誉值,让好答案排序靠前,更能帮助社区筛选出好的内容,构建高质量的知识库。
更多推荐