李白打酒—题解


标题:李白打酒

    话说大诗人李白,一生好饮。幸好他从不开车。

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。


解题思路:
                  1.搜索
                  2.暴力

源代码(java): 
public class Asist
{
static int count = 0;    // 统计多少种数

    public static void main(String[] args)
{
   
dfs(2, 0, 0, "");
 
System.out.println(count);
}
  
     // L 当时酒量,  a遇店次数, b遇花次数, str表示途径轨迹
private static void dfs(int L, int a, int b, String str)
{
if (L < 0)  return;
    if (a == 5 && b == 9 && L == 1) 
    {
    count++; 
    System.out.println(str+"b"); return;
    }
    if (a <= 5)   dfs(L * 2, a+1, b, str+"a");
    if (b <= 9)   dfs(L - 1, a, b + 1, str+"b");
}

-------------------------------------------------------------------------------------------------------------------------------
public class Main
{
public static void main(String[] args)
{
        int count = 0;   //  记录多少种情况
 
int arr[] = new int [15];   // 15次偶遇中, 要么遇花(喝酒),要么遇店(打酒),, 穷举搜索


// 0表示遇店, 1 表示遇花。  
for (arr[0] = 0; arr[0] < 2; arr[0]++)
for (arr[1] = 0; arr[1] < 2; arr[1]++)
for (arr[2] = 0; arr[2] < 2; arr[2]++)
for (arr[3] = 0; arr[3] < 2; arr[3]++)
for (arr[4] = 0; arr[4] < 2; arr[4]++)
for (arr[5] = 0; arr[5] < 2; arr[5]++)
for (arr[6] = 0; arr[6] < 2; arr[6]++)
for (arr[7] = 0; arr[7] < 2; arr[7]++)
for (arr[8] = 0; arr[8] < 2; arr[8]++)
for (arr[9] = 0; arr[9] < 2; arr[9]++)
for (arr[10] = 0; arr[10] < 2; arr[10]++)
for (arr[11] = 0; arr[11] < 2; arr[11]++)
for (arr[12] = 0; arr[12] < 2; arr[12]++)
for (arr[13] = 0; arr[13] < 2; arr[13]++)
for (arr[14] = 0; arr[14] < 2; arr[14]++)  out:
{  
int num = 2;      //  2升酒
// 模拟遇店打酒, 遇花喝酒
for (int i = 0; i < arr.length; i++)
{
    if (arr[i] == 0) num *= 2;      // 打酒
    else
    {
    if (num < 0)  break out;   // 如果没有酒了,喝不了,不满足  
    else    num -= 1;          // 喝酒
    }
}  

// 1. 所有情况中必须 5次 0, 10次1
// 2. 最后一次必须要是 1, 必须喝光。  (ps: 去年我就是死在这种情况上了!)
             if (num == 0 && arr[14] == 1)
             {   
             int sum = 0;  
             for (int i = 0; i < arr.length; i++)
             {
             sum += arr[i];
             }
             if (sum == 10) 
             {
               count++;
               for (int i = 0; i < arr.length; i++)
               {
                   System.out.print(arr[i] + " ");
               }
               System.out.println();
             }
             }
}

// 总数
System.out.println(count);
}
}




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值