蓝桥杯——李白打酒,两种做法:递归与全排列
2018-03-22 01:11
281 查看
标题:李白打酒
主要介绍两种方法:简单递归,全排列
1.递归:
2.全排列:
引入< algorithm>标准头文件,调用next_permutation(),最后排序后的数列是递减的。所以数组a中元素必须要递增写,否则不能罗列所有排列。
虽然说暴力法是万能的,但是有的时候,真的不好写,比如这道题,你起码要写15层for循环,累都累死了。当然,在没有别的办法下,能通过暴力法做出来是最好的了。
如发现有错误,欢迎指出。
话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。 注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
主要介绍两种方法:简单递归,全排列
1.递归:
#include <iostream> using namespace std; int sum = 0; void f(int a, int b, int c) { if(a > 0) f(a-1, b, c*2);//不懂的,自己画画图就明白了,跟全排列差不多 if(b > 0) f(a, b-1, c-1); if(a==0 && b==0 && c==1) //c==1,由于最后一次是遇花,还未减去1,此时判断的结果刚好是李白喝完酒了 sum += 1; } int main() { f(5, 9, 2);//遇店a,遇花b,斗酒c(为何b=9?由于最后一次是遇花,不用考虑在内,否则要排除不是遇花的情况) cout << sum << endl; return 0; }
2.全排列:
引入< algorithm>标准头文件,调用next_permutation(),最后排序后的数列是递减的。所以数组a中元素必须要递增写,否则不能罗列所有排列。
#include <iostream> #include <algorithm> using namespace std; int main() { int a[15]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,2,2,2,2};//-1遇花,2遇店 int n = 0;//记录总数 do{ int sum = 2; //初始斗酒数 for(int i=0; i<15; i++){ if(a[i] == -1){ sum += a[i]; }else{ sum *= a[i]; } } if(a[14]==-1&&sum==0){ //a[14]最后一次是遇花 n +=1; } }while(next_permutation(a,a+15));//全排列 cout<< n << endl; return 0; }
虽然说暴力法是万能的,但是有的时候,真的不好写,比如这道题,你起码要写15层for循环,累都累死了。当然,在没有别的办法下,能通过暴力法做出来是最好的了。
如发现有错误,欢迎指出。
相关文章推荐
- 历届试题 李白打酒 (递归和全排列做法)
- 蓝桥杯 李白打酒 递归
- 一道笔试题(122345求有条件全排列)的两种做法
- 全排列的两种常见方法(递归,STL)
- 蓝桥杯五3李白打酒递归或深搜
- 李白打酒 蓝桥杯 Java 递归
- 蓝桥杯常用算法知识点:【递归】求n个元素的全排列
- 李白打酒 蓝桥杯递归 java
- 【蓝桥杯】:李白打酒问题(递归重做)
- leetcode 526. Beautiful Arrangement 递归实现全排列 + 经典深度优先遍历DFS做法
- 蓝桥杯 李白打酒-递归
- 全排列的递归与非递归算法实现
- 排列数(输出0~9的全排列)-蓝桥杯算法提高
- 用递归的思想输出一个数组的全排列,和组合
- HDU 1394 (树状数组 & 线段树 两种做法)
- Java语言描述:递归与分治策略之全排列问题
- 递归生成全排列
- [Wikioi 1294]全排列---两种不同的解法(复习)
- 第四讲 递归原理--数组的全排列(递归+交换)
- 两种屏幕HUD区域限制的做法(矩形,弧形)