更多精彩文章請關註公眾號『大海的BLOG』 問題 話說大詩人李白,一生好飲。幸好他從不開車。 一天,他提著酒壺,從家裡出來,酒壺中有酒兩鬥。他邊走邊唱: 無事街上走,提壺去打酒。 逢店加一倍,遇花喝一鬥。 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了。請 ...
更多精彩文章請關註公眾號『大海的BLOG』
問題
話說大詩人李白,一生好飲。幸好他從不開車。
一天,他提著酒壺,從家裡出來,酒壺中有酒兩鬥。他邊走邊唱:
無事街上走,提壺去打酒。
逢店加一倍,遇花喝一鬥。
這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,有多少種可能的方案。
思路
我們已知遇店 5 次,遇花 10 次,並且最後一次遇到花,正好把酒喝光。那麼我們可以把店作為二進位中的 1,把花作為二進位中的 0,因為已經確定最後一次遇到的是花,所以我們需要判斷枚舉的結果是否剛好有 5個 1 和 9個 0。那麼我們就枚舉出 14 位二進位的所有可能並加以判斷即可,判斷思路為判斷二進位是否有 9 個 0,5個 1,並且最終酒剛好剩 1 鬥
實現代碼(C)
#include<stdio.h>
int main()
{
int ans=0;//方案數
for (int i=0; i<(1<<14); i++)
{
int dian=0;//表示遇到店的次數
int hua=0;//表示遇到話的次數
int num=2;//初始酒壺有兩鬥
for (int j=0;j<14 ;j++)
{
if (i&(1<<j)) //這裡判斷二進位i從右數第j+1為是否為1
{
dian++;//遇到店,次數加1
num*=2;//加一倍
}
else
{
hua++;//遇到花,次數加1
num-=1;//喝一鬥
}
}
if (dian==5&&hua==9&&num==1)
{
++ans;//記錄方法數
}
}
printf("%d\n",ans);
}
更多精彩文章請關註公眾號『大海的BLOG』