c语言李白喝酒答案,趣題C解(1)--李白喝酒問題

“李白街上走,提壺去買酒,遇店加一倍,見花喝一斗”,途中,遇見5次店,見了10此花,壺中原有2斗酒,最后剛好喝完酒,要求最后遇見的是花,求可能的情況有多少種?

分析:題目要求最后是遇見花也就是說最后是喝酒(最好剛好把酒完),出去這種確定的情況,最后剩下的情況是:還有一斗酒,前面遇到了5次店和九次花(打了5次酒,喝了九次酒)。

然后每次情況只有兩種分別是遇見花喝酒和遇到店打酒。

//dfs(num-1,mum,s*2)+dfs(num,mum-1,s-1);

遇到店的時候打酒(s*2),然后酒的斗數會翻倍;遇到花時喝酒,然后酒的斗數減一(s-1);

然后設置遞歸的出口:

當酒喝完還遇見花時,則return 0;以為酒不能是負的;

當5個店已經都遇見過時,則return 0;

當9個花已經都遇見過時,則return 0;

當花剛好遇見完,店剛好遇見完,酒還有一斗時:return 1;

當中間過程,酒喝完了,但是遇見店了,又因為此時s=0,遇到店的時候打酒(s*2),所以要把s設置成0.5;

#include

int dfs(int num,int mum,int s){

if(s<0 || num<0 || mum<0)

return 0;

if(num<0 || mum<0)

return 0;

if(num==0 && mum==0&& s==1)

return 1;

if(s==0 && num>0 && mum>=0)

s=0.5;

return dfs(num-1,mum,s*2)+dfs(num,mum-1,s-1);

}

int main()

{

printf("%d",dfs(5,9,2));

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值