zoukankan      html  css  js  c++  java
  • [USACO1.4]母亲的牛奶 Mother's Milk

    题目

       

    题目描述

    农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。

    写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

    输入输出格式

    输入格式:

    单独的一行包括三个整数A,B和C。

    输出格式:

    只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

    输入输出样例

    输入样例#1: 复制
    [输入1]
    8 9 10
    [输入2]
    2 5 10 
    
    输出样例#1: 复制
    [输出1]
    1 2 8 9 10 
    [输出2]
    5 6 7 8 9 10

    分析

       首先,我们可以看到数据规模。

      小于20

      很显然dfs 是不会爆的

      于是我们枚举情况

      a-b a-c

      b-a b-c

      c-a c-b

      用一个桶数据记录数据就不用排序了

    代码

     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 using namespace std;
     5 bool f[21][21][21];
     6 bool flag[21];
     7 int a,b,c;
     8 void dfs(int aa,int bb,int cc)
     9 {
    10     if (f[aa][bb][cc]==1) return;
    11     f[aa][bb][cc]=1;
    12     if (aa==0)
    13        flag[cc]=1;
    14     if (cc)
    15     {
    16         if (aa<a) dfs(min(aa+cc,a),bb,max(cc-a+aa,0));
    17         if (bb<b) dfs(aa,min(cc+bb,b),max(cc-b+bb,0));
    18     }
    19     if (aa)
    20     {
    21         if (bb<b) dfs(max(aa-(b-bb),0),min(bb+aa,b),cc);
    22         if (cc<c) dfs(max(aa-(c-cc),0),bb,min(cc+aa,c));
    23     }
    24     if (bb)
    25     {
    26         if (aa<a) dfs(min(aa+bb,a),max(bb-a+aa,0),cc);
    27         if (cc<c) dfs(aa,max(bb-c+cc,0),min(cc+bb,c));
    28     }
    29     
    30 }
    31 int main ()
    32 {
    33     
    34     cin>>a>>b>>c;
    35     dfs(0,0,c);
    36     for (int i=0;i<=21;i++)
    37        if (flag[i]==1)
    38          cout<<i<<" ";
    39 }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    迷宫
    小猫
    数位DP模板
    摘桃子
    [USACO10HOL]牛的政治Cow Politics
    ArcEngine中合并断开的线要素(根据几何判断)
    ArcEngine环境下合并断开的线要素(根据属性)
    Web Service和WCF的到底有什么区别
    OGC 的 WMS、WFS 及WCS服务(转)
    ArrayList的使用方法详解(转)
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10073461.html
Copyright © 2011-2022 走看看