算法练习——李白打酒

题目描述:

李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。

  • 李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?
  • 题目解析:
  • 这道题没有什么难度,但是前提是你做过这种类似的,就很好想了。解法就是使用二进制表示他遇到的花和店,那么遇到的顺序就有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;
                }
            }
        }
    }
}
发布了31 篇原创文章 · 获赞 17 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览