有趣的三个水桶等分8升水问题

有三个容积分别为3升、5升、8升的水桶,其中容积为8升的水桶中装满了水,容积为3升和容积为5升的水桶都是空的。三个水桶都没有刻度,现在需要将大水桶中的8升水等分成两份,每份都是4升水,附加条件是只能这三个水桶,不能借助其他辅助容器。

 

水桶初始状态:8L水桶装满水,3L和5L的水桶为空。
水桶最终状态:3L水桶为空,5L和8L的水桶各4L水。

假设将每个状态下三个水桶中的水的体积作为status。

从 array(8,0,0 ) -> status = array(4,4,0)

当然还会有一些限制:

1.各个水桶的都有最大值:

0 <= status[0] <= 8;

0 <= status[1] <= 5;

0 <= status[2] <= 3;

2.当前倒水之后各个水桶的状态,与历史倒水之后各个水桶的状态,不能相同。

3.当前水桶为空时,不能倒给其他水桶。

4.当前水桶为最大容积时,其他水桶不能再向这个水桶倒水。

这是一个典形的DFS状态搜索。也可以用BFS实现

 

 

 

容积为15升和27升的两个杯子的最小公倍数为135升,因此可以将水桶的容积设置为135升,这样就可以精确向水桶中注入多少升水了。 要得到52升水,可以按照如下的步骤进行操作: 1. 将15升杯子注满水,将水倒入27升杯子中,此时15升杯子中还剩下12升水,27升杯子中有15升水。 2. 将27升杯子中的水倒入水桶中,此时水桶中有15升水。 3. 将15升杯子中的剩余水倒入27升杯子中,此时15升杯子为空,27升杯子中有27 - 15 = 12升水。 4. 将水桶中的水倒入27升杯子中,此时27升杯子中有15 + 12 = 27升水水桶中剩余的水为15升。 因此,可以得到52升水。 下面是用C++实现的代码: ```c++ #include<iostream> using namespace std; int main() { int cup1 = 15; // 第一个杯子的容积为15升 int cup2 = 27; // 第二个杯子的容积为27升 int bucket = 135; // 水桶的容积为两个杯子容积的最小公倍数 // 得到52升水的操作过程 int water = 52; // 需要注入的水的升数为52升 cout << "需要得到" << water << "升水时的操作过程为:" << endl; // 将15升杯子注满水,将水倒入27升杯子中 int cup1_water = cup1; // 第一个杯子中的水的升数 int cup2_water = 0; // 第二个杯子中的水的升数 cout << "将15升杯子注满水,将水倒入27升杯子中。此时15升杯子中还剩下" << cup1 - cup2_water << "升水,27升杯子中有" << cup2_water << "升水。" << endl; // 将27升杯子中的水倒入水桶中 int bucket_water = cup2_water; // 水桶中的水的升数 cup2_water = 0; // 第二个杯子中的水的升数 cout << "将27升杯子中的水倒入水桶中。此时水桶中有" << bucket_water << "升水。" << endl; // 将15升杯子中的剩余水倒入27升杯子中 cup2_water += cup1_water; cup1_water = 0; cout << "将15升杯子中的剩余水倒入27升杯子中。此时15升杯子为空,27升杯子中有" << cup2_water << "升水。" << endl; // 将水桶中的水倒入27升杯子中 cup2_water += bucket_water; bucket_water = 0; cout << "将水桶中的水倒入27升杯子中。此时27升杯子中有" << cup2_water << "升水水桶中剩余的水为" << bucket_water << "升。" << endl; return 0; } ``` 程序输出结果为: ``` 需要得到52升水时的操作过程为: 将15升杯子注满水,将水倒入27升杯子中。此时15升杯子中还剩下3升水,27升杯子中有12升水。 将27升杯子中的水倒入水桶中。此时水桶中有12升水。 将15升杯子中的剩余水倒入27升杯子中。此时15升杯子为空,27升杯子中有27升水。 将水桶中的水倒入27升杯子中。此时27升杯子中有39升水水桶中剩余的水为0升。 ``` 因此,答案为D.52
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值