李白打酒

来源:互联网 发布:淘宝网触屏版下载安装 编辑:程序博客网 时间:2024/06/11 05:01
标题:李白打酒
    话说大诗人李白,一生好饮。幸好他从不开车。

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


    无事街上走,提壶去打酒。

    逢店加一倍,遇花喝一斗。


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

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


作为一个不懂什么是动态规划的算法初学者,楼主第一次看到这道题的时候的感觉就是这道题有什么难的,把所有的情况遍历一遍不就行了,没错就是遍历一遍,但是应该怎么样去遍历呢,第一个想法就是循环吗,有什么难的,循环0_1,但是这样的运算量感觉还是挺大的,于是我想用高中的数学知识排列组合,把10次遇花和5次遇店的所有情况排列组合一下的话次数的话,显然要比单纯的0-1全排列要少的多,但是我因为水平不高,排列组合不知道应该怎样具体的把他写出来,在琢磨了一段时间后我写了一下的代码

//李白打酒#   include <stdio.h>int n=0;void fun(int a,int b,int r){     //a表示的是花的次数 b 表示的是遇店的次数 int i;if(a>10||b>5){return;}if(a==10&&b==5&&r==0){n++;}else{for(i=1;i<=2;i++){if(i==1){if(r-1<0)return;fun(a+1,b,r-1);}if(i==2){fun(a,b+1,r*2);}}}} int main(){fun(0,0,2);printf("%d",n);return 0;}

上面的这段代码应该挺好理解的了,a表示的是遇花的次数 b,表示的是遇店的次数,r表示的是酒壶中剩余酒的多少,利用递归(其实我刚开始的时候不是很理解递归,老师也讲得不是很彻底,后来慢慢琢磨琢磨,慢慢的有点思路了),只要碰到我应该退出的地方就退出,正常情况下就一直往下递归这道题递归的出口是什么呢?遇花的次数大于10,遇店的次数大于5,或者就是中途酒壶中的酒没了而你接着再喝,或者酒壶中的酒在中途就没了,你跑过去打酒(0*2)是没有意义的只要(整幅递归图在我脑子里的话感觉就像是二叉树一样(还没学过数据结构。。。))。应该挺好理解的了。

0 0
原创粉丝点击