您的位置:首页 > 其它

算法练习——李白打酒

2016-02-03 19:21 288 查看

题目描述:

李白好饮酒,

无事街上走;

提壶去打酒,

原有酒两斗;

遇店加一倍,

遇花喝一斗。

问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?

题目解析:

这道题没有什么难度,但是前提是你做过这种类似的,就很好想了。解法就是使用二进制表示他遇到的花和店,那么遇到的顺序就有2的15次方种,穷举所有情况,使得条件为:①、只遇到5次店,十次花;②、最后一个遇到的只能是花③、酒的数量不会小于0并且在最后遇到花时喝完。

如此这般,代码就很好描述了,如下(Java描述):

public class Libaidajiu {

public static void main(String[] args) {
int count= 0;//计数

for (int i = 16384; i < 32768; ++i) {//共遇到15个花或者店  循环2的15次方次 但为保证最后一个遇到的是花,i从16384开始,使最高位为1,到时候输出的时候是倒过来的,即最后一个遇到花
int sum= 2;//酒的总数,开始时为2斗
int flower= 0;//遇见花的次数
int store= 0;//遇见店的次数
int k1= i;//k1,k2 为存储i 的变量
int k2= i;
int j= 0;
for (; j < 15; ++j) {//循环15次 确定每次遇到的是花还是店
if(k1%2==1){
flower++;//遇花喝一斗
sum-= 1;
}else {
store++;//遇店加一倍
sum*= 2;
}
if(sum<0)   break;//酒数量不会<0
if(flower>10)   break;//遇到5店10花
if(store>5) break;
k1/= 2;
}
if(j==15 && sum==0){//当j= 15 说明符合以上j的for循环中的条件
//输出sum=0的 遇到花、店的顺序
System.out.println();
System.out.print(++count+"\t");
int t= j;
while(t--!= 0 ){
if(k2%2==1)     System.out.print("花 ");
else            System.out.print("店 ");
k2/= 2;
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: