看到网上这道题好像没有记忆化dfs的写法,我就在这里简单说一下吧。(296ms)

/*by:lwq132lwq*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define ll long long
#define dd double
#define re register
#define il inline
#define pb push_back
#define fr frist
#define sc second
#define rep(i,a,n) for(register int i=a;i<=n;i++)
#define fep(i,a,n) for(register int i=n;i>=a;i--)
using namespace std;
template <class T> void read(T &x){x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9'){f|=(ch=='-');ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=f?-x:x;return ;
}
bool cmp(int x,int y){return x>y;}
dd ddabs(double x){if(x<0) return -x;else return x;}
int gcd(int a, int b){return b ? gcd(b,a%b):a;}
int max(int a,int b){if(a>b) return a;else return b;}
int min(int a,int b){if(a<b) return a;else return b;}
int qkpow(int x,int y){int ans=1;while(y){if(y&1) ans*=x;y>>=1;x*=x;}return ans;}
const double eps=1e-6;
const int maxn=1e6+10;
int n,s,m,ans=1e9;
int f[101][101][101];
void dfs(int S,int N,int M,int c)
{
//  debug:                        cout<<"S=="<<S<<" N=="<<N<<" M=="<<M<<" C=="<<c<<"\n";if((S==N&&S+N==s)||(S==M&&S+M==s)||(M==N&&M+N==s))          {ans=min(ans,c);return ;}if(N+M<=m) if(!f[S][0][N+M])         f[S][0][N+M]=1,dfs(S,0,M+N,c+1),f[S][0][N+M]=0;if(N+M<=n) if(!f[S][N+M][0])          f[S][N+M][0]=1,dfs(S,M+N,0,c+1),f[S][N+M][0]=0;if(N+S<=s) if(!f[N+S][0][M])         f[N+S][0][M]=1,dfs(S+N,0,M,c+1),f[N+S][0][M]=0;if(M+S<=s) if(!f[M+S][N][0])         f[M+S][N][0]=1,dfs(S+M,N,0,c+1),f[M+S][N][0]=0;if(N+S<=n) if(!f[0][N+S][M])         f[0][N+S][M]=1,dfs(0,S+N,M,c+1),f[0][N+S][M]=0;if(M+S<=m) if(!f[0][N][M+S])         f[0][N][M+S]=1,dfs(0,N,S+M,c+1),f[0][N][M+S]=0;          if(S>=m-M) if(!f[S-m+M][N][m]) f[S-m+M][N][m]=1,dfs(S-m+M,N,m,c+1),f[S-m+M][N][m]=0;if(S>=n-N) if(!f[S-n+N][n][M]) f[S-n+N][n][M]=1,dfs(S-n+N,n,M,c+1),f[S-n+N][n][M]=0;  if(N>=m-M) if(!f[S][N-m+M][m]) f[S][N-m+M][m]=1,dfs(S,N-m+M,m,c+1),f[S][N-m+M][m]=0; if(M>=n-N) if(!f[S][n][M-n+N]) f[S][n][M-n+N]=1,dfs(S,n,M-n+N,c+1),f[S][n][M-n+N]=0;
}
int main()
{while(true){read(s);read(n);read(m);ans=1e9;if(n==0&&s==0&&m==0) break;memset(f,0,sizeof(f));if(s%2||s!=n+m) cout<<"NO"<<"\n";else {f[s][0][0]=1; dfs(s,0,0,0);if(ans==1e9) cout<<"NO"<<"\n";else cout<<ans<<"\n";}}return 0;
}

我这里分了十种情况来写:

定义三个杯子:S,N,M;

1.把N中所有的可乐倒进M中

2.把M中所有的可乐倒进N中

3.把N中所有的可乐倒进S中

4.把M中所有的可乐倒进S中

5.把S中所有的可乐倒进N中

6.把S中所有的可乐倒进M中

7.把S中部分的可乐倒进M中,使得M==m

8.把S中部分的可乐倒进N中,使得N==n

9.把N中部分的可乐倒进M中,使得M==m

10.把M中部分的可乐倒进N中,使得N==n

注意:在这里我们不需要(把N或者M中的部分可乐倒回去使得S==s,因为这样就回到我们的初始状态了,所以我们不需要写这种情况)

我们对一些情况进行特判,当s是奇数的情况下是不可能成功的,因为有小数我们没法处理。其他情况下如果我们的答案等于的话就是NO。

最快最简单的方法是数论(31ms),在这里放一个链接HDU 1495 非常可乐(数论)大家可以自己去看(有证明)。

HDU1495-非常可乐相关推荐

  1. 【HDU1495非常可乐】【POJ3414Pots】

    HDU1495非常可乐 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和se ...

  2. HDU1495 非常可乐

    问题链接:HDU1495 非常可乐. 题意简述:平分液体问题.输入s.n和m三个数,分别代表可乐和2个杯子,三个容器可以互相倒,问能不能把s中的可乐平分,能的话输出最小倒杯子的次数,不能就输出NO. ...

  3. HDU1495 非常可乐【倒水问题+BFS】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. HDU1495 非常可乐 【BFS】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. hdu1495非常可乐

    /*此题其实是一道简单的bfs,主要是抽象一下,将两个人的杯子以及可乐瓶抽象为三个容器,且可以互相倒饮料,那么将每种倒饮料的方法枚举出来就6中,两两互相到当然只有6种,此外就是对倒完饮料的判断题目中解 ...

  6. hdu1495 非常可乐(bfs)

    Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且 ...

  7. CCF认证训练行动路线图

    通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...

  8. TYUT-A专题题解(二)

    TYUT-A专题题解(一) TYUT-A专题题解(二) 36暴力枚举 AOJ0008 Sum of 4 Integers[暴力]_海岛Blog-CSDN博客 HDU1407 测试你是否和LTC水平一样 ...

  9. HDU各种比赛题题解(一)

    HDU各种比赛题题解(一) Gardon-DYGG Contest 1 HDU1178 Heritage from father[水题] - 海岛Blog - CSDN博客 HDU1181 变形课[D ...

  10. kuangbin 专题一 简单搜索

    kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...

最新文章

  1. Java类和对象的初始化顺序
  2. linux如何使用物理内存_10 张图解再谈 Linux 物理内存和虚拟内存
  3. ASP.NET 常用验证
  4. 操作系统基础:计算机作业管理知识笔记
  5. idea中pom.xml文件横线解决办法
  6. 计算机一级某学校师资情况表,2011年计算机一级考试MS OFFICE上机考试指导
  7. numpy.repeat作用,语法,参数解读以及实例
  8. java innerexception_java – 为什么使用反射访问外部类的私有成员抛出IllegalAccessException?...
  9. 红外夜视摄像头 蒂卡尔K-TF使用手记 2
  10. rhel6.5搭建mantis时报错
  11. STEP2——《数据分析:企业的贤内助》重点摘要笔记(一)——方案部分
  12. csdn没积分如何获取
  13. Honey Badger BFT(异步共识算法)笔记
  14. 调研-python使用win32com模块操纵excel
  15. mysql数据库时区配置
  16. digitalpersona 开发(系统托盘,监听指纹扫描)
  17. 二叉树的公共祖先问题
  18. python求excel平均数_#python抓取excel表格数据#使用python3读取处理excel表的数据内容如何对内容求平均值...
  19. Android实现画板功能(一)
  20. AST学习笔记 至少入个大门

热门文章

  1. matlab一些常用的技巧函数
  2. Mac配置iTerm2、Git等
  3. 程序员常常看到的英文
  4. 静态建模(类图和对象图)
  5. 手把手教你上传女神照片到服务器
  6. @CrossOrigin(origins = *,maxAge = 3600)解决跨域的问题的注解
  7. Windows修改3389端口
  8. The Clouds
  9. java车次信息_车次查询示例代码
  10. MATLAB得到贝塞尔函数零点