倒水问题

一、问题描述:

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

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

可以进行的操作是:

  把一个容器灌满;

  把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);

  用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。

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

二、分析

一个标准的倒水问题是一个扩展的欧几里得算法。就是看 A*x+B*y=M这个方程有没有x,y的整数解的问题,

定理

   对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。如果求出最大公约数以后,再用C对这个公约数取模,如果为0表示满足要求,否则就不行。
最大公约数求法:辗转相除法 辗转相减法

三、是否存在倒水方案

简单的说,就是通过辗转相除得到一个公约数,而这个公约数是a和b互相倒水可以倒出来的,再看这个公约数是不是c的约数

比如3和5,辗转相除以后,最大公约数是1,这个1是这么倒水倒出来的。再看1是不是c的约数,如果是,那就能倒1,倒1,倒1。。。一直倒满c了。再比如4和6,辗转相除以后是2,这样,如果c是一个奇数,就到不满了。。

四、倒水方案

不断用小桶装水倒入大桶,大桶满了立即清空,每次判断下二个桶中水的容量是否等于指定容量

参考

http://blog.sina.com.cn/s/blog_6c777201010144tj.html

 

posted on   小强斋太  阅读(842)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示