写在前面:
泊松分酒:
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有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语言产生泊松分布[归类].pdf
用有限差分方法计算泊松方程,并用matlab编程
泊松融合 能够将两个图片无缝衔接,过渡自然。
基于泊松方程实现点云的表面重构
通过matlab实现二维泊松求解,采用构建系数矩阵的形式,对系数矩阵求逆矩阵可获得最终结果。
五点差分格式求解possion方程和拉普拉斯方程,并用方形网格
利用matlab对珀松方程作有限差分计算
有限差分法解泊松方程、拉普拉斯方程 定义边界后利用五点差分法求解
利用泊松过程,实现泊松点过程和泊松簇过程
本代码是利用C语言实现的二维泊松碟采样方法,该采样方法兼备了随机采样的随机性以及规则采样的均匀性,未压缩感知的数据采集提供了很好的采集算法
压缩包中含有部分3D点云文件,并有完整的以VS2010为开发平台开发的win32项目,可以完美运行。主要实现3D点云文件的曲面重建,可将残缺模型重建为较为理想的新模型却不改变模型原本的拓扑结构。
在一个六边形区域内生成服从泊松过程的一定数量的点
Poisson泊松方程的差分方法matlab实现
一个用于解决二维泊松方程的求解,用有限元中的三角形剖分
常用材料泊松比,常用材料泊松比,常用材料泊松比
用Python进行泊松分布,代码分析
给出了泊松方程在矩形网格剖分下的五点差分外推法,证明了该方法是四阶方法.通过数值算例,验证了该方法的精确度和有效性,并从计算量、收敛阶和适用性等方面与九点差分法进行了比较.