java实现分酒(泊松分酒)

本文探讨了如何使用不同容量的容器从一个大容器中精确分出所需容量的液体。通过设计程序解决泊松分酒问题,即如何利用特定容量的容器从一瓶酒中分出所需的酒量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:
泊松分酒:
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值