【算法】倒水问题 *

  在csdn网站上,闲来无事,做了几道算法。没想到居然把学过的算法都忘的差不多了,索性每次记录下一点,回头还可以看看。

  Question:

  有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。

  我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。

  可以进行的操作是:

  1. 把一个容器灌满;
  2. 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
  3. 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。

  问是否能够通过有限次操作,使得水缸最后恰好有C升水。 

  输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000

  输出:0或1,表示能否达到要求。

  Analysis:

  其实我当时也就很快得出,只需满足存在a,b,使得等式 aX+bY=c 成立。

  于是乎,我就妄图使用穷尽法,不过我忽略了两个问题:1、a,b是实数,虽然a和b中肯定至少有一个大于0,但是a和b的取值范围都是任意实数。2、循环次数太多,运行时长太长了。所以我才上网搜了一下,我才想起了欧几里得定理。

  对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

  Answer:

  这么简单的代码实现,我就不在这粘贴出来了。

posted @ 2013-10-14 19:37  ssdut-deng  阅读(726)  评论(0编辑  收藏  举报