
正确的结果:对兑了17次,共换了93个瓶子,第18次对兑时余下1个空瓶,2个瓶盖。
递归模型楼上“lzs丶灬 ”同志是正确的,但存在逻辑错误。我帮他修正如下:
public static int test(int sum, int pingzi, int gaizi){if (pingzi < 2 && gaizi < 3)
{
return sum
}
int newPingzi = pingzi / 2
int newGaizi = gaizi / 3
sum += newPingzi
sum += newGaizi
pingzi = newPingzi + newGaizi + pingzi % 2
gaizi = newGaizi + newPingzi + gaizi % 3
return test(sum, pingzi, gaizi)
}
其实,最多可以喝50瓶酒~public class TestBottle {
public static void main(String[] args) {
int all=drink(100)
System.out.println("最多可以喝"+all+"瓶酒。")
}
public static int drink(int bottle){
int dr=0//初始化可以喝的酒数
while (bottle >1) {//当酒瓶大于一时,可以兑换
dr+=bottle/3//总共兑换的酒数目=兑换酒数(he)+本轮可以兑换的酒数(num/3)
bottle=bottle/3+bottle%3//剩下瓶子数目=本轮可以兑换的酒数(num/3)+剩下的瓶子数(bottle%3)
if(2==bottle){//当最后剩下两个瓶子时,可以借一个瓶子,凑成三个,然后兑换一瓶酒,喝完后还回瓶子
dr++//可以喝的酒数加一
bottle=0//剩下0个瓶子
}
}
return dr
}
}
//-------------------------------正向的算法,就是知道N和M算出P----------------------------------------int left=0,sum=0,newBott=0
int N=34,M=3//要改M,N值在这里改
newBott = N
sum =N
if(M==1){System.out.println("无限换")}
else
{
while((newBott+left)>=M) //如果还能换
{
int temp1 = (newBott+left)%M //换了之后剩下不够换的
int temp2 = (newBott+left)/M //换出来新的
left = temp1
newBott = temp2
sum = sum + newBott + left//总数增加
}
System.out.println("一共可换 "+sum+ " 瓶")
}
//------------------------------反向算法,就是知道P,M算出N---------------------------------------------
int left=0,sum=0,newBott=0
int N,M=15,P=222//要改M,P值在这里改
labelA: for(N=MN<PN++)
{
if(M==1){N=1System.out.println("需要 "+ N+ "瓶")break} //如果可以1瓶换1瓶,那就只用1瓶
if(M==0){N=PSystem.out.println("需要 "+ N+ "瓶")break} //如果可以1瓶换0瓶,那就用P瓶
sum =N
newBott = N
while((newBott+left)>M)
{
int temp1 = (newBott+left)%M
int temp2 = (newBott+left)/M
left = temp1
newBott = temp2
sum = sum + newBott + left
if(P==sum){System.out.println("需要 "+ N+ "瓶")
break labelA}
}
}
//--------------------------------------------------------------------------------
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)