复习3-3511. 倒水问题

本文介绍了一道经典的倒水问题,通过递归搜索算法找出所有可能的状态转移方案,旨在求解给定三个不同容量杯子时目标杯子可能存在的水量状态数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3511. 倒水问题

有三个杯子,容量分别为 A,B,CA,B,C。

初始时,CC 杯装满了水,而 A,BA,B 杯都是空的。

现在在保证不会有漏水的情况下进行若干次如下操作:

将一个杯子 xx 中的水倒到另一个杯子 yy 中,当 xx 空了或者 yy 满了时就停止(满足其中一个条件才停下)。

请问,在操作全部结束后,CC 中的水量有多少种可能性。

输入格式

输入包含多组测试数据。

每组数据占一行,包含三个整数 A,B,CA,B,C。

输出格式

每组数据输出一个结果,占一行。

数据范围

0≤A,B,C≤40000≤A,B,C≤4000,
每个输入最多包含 100100 组数据。

输入样例:

0 5 5
2 2 4

输出样例:

2
3

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int A,B,C;
map<int,int>mp,Mp;
void dfs(int a,int b,int c)
{
    //cout << a<<' '<<b<<' '<<c<<endl;
    if(mp[a*4000+b])
    return ;
    if(a<0||b<0||c<0)
    return ;
    mp[a*4000+b]++;
    Mp[c]++;
    dfs(a-min(a,B-b),b+min(a,B-b),c);
    dfs(a-min(a,C-c),b,c+min(a,C-c));
    dfs(a+min(A-a,b),b-min(A-a,b),c);
    dfs(a,b-min(b,C-c),c+min(b,C-c));
    dfs(a+min(A-a,c),b,c-min(A-a,c));
    dfs(a,b+min(B-b,c),c-min(B-b,c));
}
int main()
{
    while(cin >> A>>B>>C)
    {
        dfs(0,0,C);
        cout << Mp.size()<<endl;
        Mp.clear(); 
        mp.clear();   
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值