写在前面:
泊松分酒:
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有12品脱的啤酒一瓶,想从中倒出六品脱,但是恰巧身边没有6品脱的容器,仅有一个8品脱和一个5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?现在,请你设计一个程序,可以根据输入的满瓶容量(a),和两个空瓶的容量(b和c)对倒,获得最终需要的容量(d)。
上周考笔试,有道题可能出现,想了N久也不会。最后考试中虽然没考它,但是突然就想明白了。
/**
* @discription 酒瓶是8升酒,有两个杯,分别为3升和5升,现在想得到两杯4升的酒。
* 肿么分这瓶酒啊?
*/
void text(){
fenjiu(8,5,3,4);
fenjiu(12,8,5,6);
}
/***
* 倒酒方法
* @param i 盛酒
* @param j 倒酒
* @param wine 三个容器中酒量的数组
* @param cup 酒瓶和两个杯子容量的数组
* @param sunxu 酒瓶和两个杯子顺序的数组
* @param N 循环次数
* @param d 要得到的酒量
* @return
*/
int daoba(int i,int j,int[]wine,int[]cup,int[]sunxu,int N,int d){
int k = 3-i-j;
if(wine[k]==0&&wine[i]!=0&&(wine[i]<cup[k]||wine[i]==cup[k])){
wine[k]=wine[i];
wine[i]=0;
System.out.println("第"+sunxu[i]+"杯"+"倒, 第"+sunxu[k]+"杯");
System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
}
System.out.println("第"+sunxu[j]+"杯"+"到, 第"+sunxu[i]+"杯");
//第一杯不接满,第二杯倒空
if(wine[j]+wine[i]<cup[i]){
wine[i]+=wine[j];
wine[j]=0;
System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
if(wine[i]==d&&wine[k]==d){
N=1000;
return N;
}
//第一杯接满,第二杯不到空
}else if(wine[j]-cup[i]+wine[i]>0){
wine[j]=wine[j]-cup[i]+wine[i];
wine[i]=cup[i];
System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
if(wine[k]==d&&wine[j]==d){
N=1000;
return N;
}
//第一杯接满,第二杯倒空
}else if(wine[j]+wine[i]==cup[i]){
wine[i]=cup[i];
wine[j]=0;
System.out.println(wine[0]+" "+wine[1]+" "+wine[2]);
}
return N;
}
/**
* 分酒方法
* 1.先将杯子排序,大杯子放前面,小杯子放后面
* 2.酒瓶的酒先倒入大杯子
* 3.大杯子的酒倒入小杯子
* 4.小杯子酒倒入瓶中
* 5.如果大杯子有酒,那么将其倒入小杯子后再将瓶中酒倒入大杯子
* 6.重复此过程,直到其中两个容器中都有d升酒
* @param a 酒瓶容量
* @param b 第一个杯子
* @param c 第二个杯子
* @param d 要得到的酒量
*/
void fenjiu(int a,int b,int c,int d){
int wine[]={a,0,0};
int cup[]={a,b,c};
int sunxu[]={1,2,3};
int N = 0;
int timeO = 0;//执行次数
//排列杯子
if(cup[1]<cup[2]){
cup[1]=c;
cup[2]=b;
sunxu[2]=2;
sunxu[1]=3;
}
while(N!=1000&&timeO<10000){
for(int i=0;i<3;i++){
int j = i+1;
if(j>2){
j=0;
}
if(wine[i]!=0&&wine[j]!=cup[j]){
N = daoba(j,i,wine,cup,sunxu,N,d);
}
timeO++;
}
}
System.out.println(timeO);
}
写在后面:
后来网上搜,正解,也就是最优解是通过广度搜索算法得到的。
这个,等有灵感了再写。
突然觉得算法也挺好玩儿的啊!
*****************************格叽格叽*****************************
“好男人不会让心爱的女人受一点点伤”————张赫宣唱的真不错!是吧?lysh
分享到:
相关推荐
泊松分酒源代码,典型的广搜算法解决,很好的学习广搜算法的一般模式求解问题
本文档主要介绍了如何使用 Java 语言产生泊松分布的随机数,并讨论了相关的理论基础和算法实现。 一、实验目的 实验目的旨在利用 Java 语言产生符合泊松分布的随机数,以解决 rand 函数的局限性问题。_rand 函数...
用有限差分法求解方程,里面有两个文件,其中一个是泊松方程,另外一个是求解其他势能的方程
在本资料中,我们将深入探讨如何利用Matlab的有限差分方法来求解泊松方程。 泊松方程通常写作: ∇²u = f 其中,u是未知函数,f是已知源项,∇²是拉普拉斯算子,表示空间中某个区域内的二阶偏导数之和。泊松方程...
泊松融合(Poisson Blending)是一种高级的图像融合技术,它主要用于图像合成和编辑,使得两张图像的交界处能够实现无缝对接,过渡效果自然,无明显的边界痕迹。这种技术尤其适用于图像拼接、场景合成等领域,可以极...
在MATLAB中,可以通过以下步骤实现上述有限差分法求解二维泊松方程: 1. **定义网格**:首先定义网格参数,如网格大小 $N$ 和网格步长 $h$。 2. **初始化矩阵**:创建一个 $(N+1) \times (N+1)$ 的矩阵用于存储所有...
五点差分格式是一种常用的方法,尤其适用于处理在二维平面上的泊松方程(Poisson Equation)和拉普拉斯方程(Laplacian Equation)。这两种方程在电磁学、流体力学、热传导等多个物理现象中都有广泛应用。五点差分...
泊松方程的求解通常采用迭代方法,如有限差分法或谱方法。在3D空间中,这涉及到大量的计算,因此高效的数值计算库如Eigen、Blaze或OpenBLAS可能会被用于加速矩阵运算。在实现过程中,需要注意内存管理和计算效率,以...
在JAVA编程中,实现泊松分布的图形界面可以帮助用户直观地理解这种分布特性,并进行相关计算与模拟。下面将详细介绍如何在JAVA中实现泊松分布的图形界面以及涉及到的相关知识点。 首先,我们要了解泊松分布的基本...
通过matlab实现二维泊松求解,采用构建系数矩阵的形式,对系数矩阵求逆矩阵可获得最终结果。
### 基于泊松方程实现点云的表面重构 #### 1. 引言 随着激光扫描技术的进步,现在能够获取到包含更多细节的散乱数据,这对于高精度的三维模型构建变得越来越重要。根据采集的数据进行模型重建,在众多行业中具有...
图像泊松融合(Poisson Blending)是一种高级的图像合成技术,主要用于图像融合领域,其核心在于通过解决泊松方程来实现像素级别的平滑过渡。这种算法相较于其他简单的融合方法,如平均融合或拉普拉斯融合,能提供更...
在本案例中,我们聚焦于如何利用PCL(Point Cloud Library)这个开源库来实现泊松重建,以获取三维点云的形貌特征。 首先,我们要理解泊松重建的基本原理。泊松重建是通过解决泊松方程来实现的,该方程是一个偏微分...
泊松点过程是一种随机几何对象,它在统计物理学、地理信息系统、无线通信网络等领域有着广泛的应用。在MATLAB中,我们可以利用编程技巧来模拟和生成泊松点过程。本项目"程序.zip_matlab_泊松点过程_生成泊松过程...
- `poisson_reconstruction`:泊松重建算法的实现,包含泊松方程的求解过程。 - `triangulation`:三角化模块,可能使用PCL的`pcl::GreedyProjectionTriangulation`或其他方法将曲面离散化为三角网格。 - `post_...
在本文中,我们将深入探讨如何使用ABAQUS软件结合Python进行二次开发,以实现负泊松比材料的参数化建模。负泊松比是一种特殊的材料特性,它指的是材料在受压时横向膨胀而非收缩的现象,这在某些工程应用如航空航天、...
有限差分法解泊松方程、拉普拉斯方程 定义边界后利用五点差分法求解
泊松方程的五点差分外推法是一种在求解泊松方程边值问题时使用的数值分析技术,适用于计算物理和工程领域中,尤其在需要考虑稳定流场、稳定温度场分布以及静电场分布等情况下。本文所讨论的方法为在矩形网格剖分下...
在此,我们将深入探讨泊松抠图的原理、实现方法以及源代码的解析。 首先,我们需要理解泊松方程在图像处理中的应用。泊松方程是一个偏微分方程,常用于物理和工程领域,但在图像处理中,它可以用来解决图像融合和...