浏览 2087 次
锁定老帖子 主题:java实现分酒(泊松分酒)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-01-13
泊松分酒: 法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |