zoukankan      html  css  js  c++  java
  • 泊松分酒(穷举法)

    泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
     
        有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
     
        有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。
     
        下面的列表是可能的操作状态记录:
    12,0,0
    4,8,0
    4,3,5
    9,3,0
    9,0,3
    1,8,3
    1,6,5
     
        每行3个数据,分别表示12,8,6升容器中的油量
     
        第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...
     
        当然,同一个题目可能有多种不同的正确操作步骤。
     
        本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出一种实现的步骤(不需要找到所有可能的方法)。如果没有可能实现,则输出:“不可能”。
     
        例如,用户输入:
    12,8,5,12,0,0,6
     
        用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)

    首先定义一套规则

    题目中的瓶子总共有三种,最大的A,中等的B,最小的C,我们规定:

    最大的瓶子只能往中等的瓶子倒;(若中等的瓶子为空)

    中等的瓶子只能往最小的瓶子倒;(若最小的瓶子不满)

    最小的瓶子只能往最大的瓶子倒;(若最小的瓶子已满)

    这样就会产生一个循环,并且可以理解为已最小瓶子的容量为度量进行A->B->C的循环,B作为中间体,只有空了之后才会从A中调入,这样就可以保证每一次的倒入都是独一无二的,而且可以包容所有的情况并且符合倒入规则。

     1 package com.dn.sf;
     2 
     3 
     4 /**
     5  * 该方法实现泊松分酒
     6  * // 每次倒酒都要倒满或者一个杯子全部倒空
     7  * 首先定义一套规则
     8     
     9     题目中的瓶子总共有三种,最大的A,中等的B,最小的C,我们规定:
    10     
    11     最大的瓶子只能往中等的瓶子倒;(若中等的瓶子为空)
    12     中等的瓶子只能往最小的瓶子倒;(若最小的瓶子不满)
    13     最小的瓶子只能往最大的瓶子倒;(若最小的瓶子已满)
    14  * @author Administrator
    15  *
    16  */
    17 public class ShareWine {
    18     //三个杯子容量
    19     private int b1 = 12;
    20     private int b2 = 8;
    21     private int b3 = 5;
    22     //目标酒量
    23     private int m = 11;
    24 
    25     public void backBottle(int bb1,int bb2,int bb3){
    26         System.out.println("bb1:"+bb1+"	bb2:"+bb2+"	bb3:"+bb3);
    27         //三个参数是杯子初始有多少酒在里面
    28         
    29         //当三个杯子刚好和目标容量一致就退出
    30         if(bb1==m || bb2==m || bb3==m){
    31             System.out.println("分好了");
    32             return;
    33         }
    34         
    35         //三种情况,1倒2,2到3,3到1
    36         if(bb2==0){//先把第一个杯子倒到第二个杯子里面(第二个杯子为空)
    37             if(bb1<=b2){
    38                 backBottle(0, bb1, bb3);
    39             }else{
    40                 backBottle(bb1-b2, b2, bb3);
    41             }
    42         }else if(bb3!=b3){//把第二个杯子倒入第三个杯子中(第三个杯子未满)
    43             if(bb2+bb3<=b3){
    44                 backBottle(bb1, 0, bb2+bb3);
    45             }else{
    46                 backBottle(bb1, bb2-(b3-bb3), b3);
    47             }
    48         }else if(bb3==b3){//第三个杯子到人第一个杯子中(第三个杯子满了)
    49             if(bb3+bb1<=b1){
    50                 backBottle(bb1+bb3, bb2, 0);
    51             }else{
    52                 backBottle(b1, bb2, bb3-(b1-bb1));
    53             }
    54         }
    55     }
    56     
    57     public static void main(String[] args) {
    58         ShareWine sw = new ShareWine();
    59         sw.backBottle(12, 0, 0);
    60     }
    61 }
  • 相关阅读:
    Leetcode-784 Letter Case Permutation(字母大小写全排列)
    Leetcode-450 Delete Node in a BST(删除二叉搜索树中的节点)
    Leetcode-423 Reconstruct Original Digits from English(从英文中重建数字)
    Leetcode-692 Top K Frequent Words(前K个高频单词)
    Leetcode-355 Design Twitter(设计推特)
    Leetcode-229 Majority Element II(求众数 II)
    Leetcode-557 Reverse Words in a String III(反转字符串中的单词 III)
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/xiongmozhou/p/10373193.html
Copyright © 2011-2022 走看看