泊松分酒

泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。

有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。

有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。

在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。

有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

用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,

最后一个数是要求得到的油量(放在哪个容器里得到都可以)

则程序可以输出(答案不唯一,只验证操作可行性):

12,0,0

4,8,0

4,3,5

9,3,0

9,0,3

1,8,3

1,6,5

每一行表示一个操作过程中的油量状态。

一 .  解答过程

为了方便说明,将容量为12品脱,8品脱,5品脱瓶子分别称为大瓶子,中瓶子,小瓶子。按照下面2种规则中的如何一种可以解决这个问题:

第一套规则:

1. 大瓶子只能倒入中瓶子

2. 中瓶子只能倒入小瓶子

3. 小瓶子只能倒入大瓶子

4. 小瓶子只有在已经装满的情况下才能倒入大瓶子

5. 若小瓶子被倒空,则无论中瓶子是否满,应马上从中瓶子倒入小瓶子

之所以要规定倒酒的顺序是为了防止状态重复。而根据这5条规则,大瓶子每次倒入中瓶子的酒总是8品脱,小瓶子每次倒入大瓶子的酒总是5品脱。(请结合下面的表来理解这句话,理解这点很重要)

//a,b,c为每个容器的最大容量,arr[0],arr[1],arr[2]分别代表着三个容器的当前容量

import java.util.Scanner;

public class 泊松分酒 {

public static void main(String[] args) {
  Scanner input=new Scanner(System.in);
  String str=input.nextLine();
  String[] strs=str.split(",");
  int a=Integer.parseInt(strs[0]);
  int b=Integer.parseInt(strs[1]);
  int c=Integer.parseInt(strs[2]);
  int[] arr=new int[3];
  arr[0]=Integer.parseInt(strs[3]);
  arr[1]=Integer.parseInt(strs[4]);
  arr[2]=Integer.parseInt(strs[5]);
  int n=Integer.parseInt(strs[6]);
  while(true){
   if(arr[0]>0&&arr[1]!=b){
    if(arr[0]<b-arr[1]){
     arr[1]=arr[1]+arr[0];
     arr[0]=0;
    }
    else{
     arr[0]=arr[0]-(b-arr[1]);
     arr[1]=b;
    }
    System.out.println(arr[0]+","+arr[1]+","+arr[2]);
    if(arr[0]==n||arr[1]==n||arr[2]==n){
     break;
    }
   }
   
   
   if(arr[1]>0&&arr[2]!=c){
    if(arr[1]<c-arr[2]){
     arr[2]=arr[2]+arr[1];
     arr[1]=0;
    }
    else{
     arr[1]=arr[1]-(c-arr[2]);
     arr[2]=c;
    }
    System.out.println(arr[0]+","+arr[1]+","+arr[2]);
    if(arr[0]==n||arr[1]==n||arr[2]==n){
     break;
    }
   }
   
   
   if(arr[2]==c){
    if(arr[0]+arr[2]>a){
     arr[2]=a-arr[0];
     arr[0]=a;
    }
    else{
     arr[0]=arr[0]+arr[2];
     arr[2]=0;
    }
    System.out.println(arr[0]+","+arr[1]+","+arr[2]);
    if(arr[0]==n||arr[1]==n||arr[2]==n){
     break;
    }
   }
   
   
   if(arr[1]>0&&arr[2]!=c){
    if(arr[1]<b-arr[2]){
     arr[2]=arr[2]+arr[1];
     arr[1]=0;
    }
    else{
     arr[1]=b-arr[2];
     arr[2]=b;
    }
    System.out.println(arr[0]+","+arr[1]+","+arr[2]);
    if(arr[0]==n||arr[1]==n||arr[2]==n){
     break;
    }
   }
   
   
  }
 }

}

时间: 2024-08-08 06:11:19

泊松分酒的相关文章

算法笔记_219:泊松分酒(Java)

目录 1 问题描述 2 解决方案   1 问题描述 泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒".在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:"韩信走马分油"问题. 有3个容器,容量分别为12升,8升,5升.其中12升中装满油,另外两个空着.要求你只用3个容器操作,最后使得某个容器中正好有6升油.

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

java面试趣味程序

一 泊松分酒1.有一个12品脱的酒瓶,里面装满葡萄酒,另有8品脱和5品脱的瓶子各一个,问如何分出6品脱的酒出来 public class Poissonpointsofwine { static final int L=12; //大屏容量 static final int M=8; static final int S=5; static int l=12; //大瓶实际酒量 static int m=0; static int s=0; static void LintoM() { if(l

Android中的算法

算法是思想的体现形式,常见的算法做一些总结 算法简介 算法-Algorithm 解题方案的准确而完整的描述,是一系列解决问题的清晰指令 特征 有穷性,确切性,输入项,输出项,可行性 算法运算要素 算术运算:加减乘除等运算 逻辑运算:或.且.非等运算 关系运算:大于.小于.等于.不等于等运算 数据传输:输入.输出.赋值等运算 算法优劣评定 时间复杂度,空间复杂度,正确性,可读性,健壮性 LogN 二分法查找最坏的情况:对于N个元素的数组,第一次查找未找到则舍弃 N/2 个元素,剩下 N/2,同理第

信息安全系统设计基础第十三周总结

第11章 网络编程 1.网络应用随处可见.任何时候你浏览Web.发送Email或者弹出一个X window,你就正在使用一个网络应用程序.有趣的是,所有的网络应用都是基于相同的基本编程模型有着相似的整体逻辑结构,并且依赖相同的编程接口. 2.网络应用依赖于很多在系统研究中已经学习过的概念,例如,进程.信号.字节器映射以及动态存储分配,都扮演着重要的角色.还有一些新概念要掌握.我们需要理解基本的客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端―服务器程序.最后,我们将把所有这些概念

信息安全系统设计基础第十三周学习总结——20135308

第11章 网络编程 所有的网络应用都是基于相同的基本编程模型有着相似的整体逻辑结构,并且依赖相同的编程接口. 网络应用依赖于很多在系统研究中已经学习过的概念,例如,进程.信号.字节器映射以及动态存储分配,都扮演着重要的角色. 我们需要理解基本的客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端―服务器程序. 我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web的服务器,能够为真实的Web,浏览器提供静态和动态的文本和图形内容. 11.1 客户端-服务器编程模型 1.每个网络

20135205信息安全系统设计基础第十三周学习总结

第11章 网络编程 网络应用依赖于很多在系统研究中已经学习过的概念,例如,进程.信号.字节器映射以及动态存储分配,都扮演着重要的角色.还有一些新概念要掌握.我们需要理解基本的客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端―服务器程序.最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web的服务器,能够为真实的Web,浏览器提供静态和动态的文本和图形内容. 11.1 客户端-服务器编程模型 每个人网络应用都是基于客户端-服务器模型的.才有陪你过这个模型,一个应用是由一

[MFC]解决回车键ESC默认关闭窗口的一般方法

滑勰 ч休渚殪 氖贸德质懦苫佑境鄙道肥孔细傅部 菲陵谦磺 ず诗碜遛 李玉斧之后为那盏油灯添了一次油期间吃过一些干枣果腹的余福已经昏昏欲睡李玉斧让 贤鹧吟 龉氐怯桠 茵劓{ Э鹚 这位以勤政勤俭和守业有术著称的皇帝站起身走向门槛时笑了笑停下脚步"朕要承认 司嫒涤 甥缶溏颁 凭恳澹 缳鍪桄黔 昂镜骺犟 琅馀羹沛 使了一通剑气滚龙壁将十几头前赴后继的野牛分尸碎骨代价便是再抑制不住的口喷鲜血 惯岗獠 趴蒋著 终瀛ラ 不算多一见连宫里娘娘都发火了立即醍醐灌顶般清醒过来先是写了一首绝交

牛人的ACM经验 (转)

一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中) 4,图(基本概念,存储结构,图的运算) 数学知识 1,离散数学知识的应用(如排列组合.简单的图论,数 理逻辑) 2,数论知识 3,线性代数 4,组合代数 5,计算几何 二 算法 1,排序算法(冒抛法,插入排序,合并排序,快速排 序,堆排序) 2,查找(顺序查找,二分发) 3,回溯算法 4,递归算