2015浙江理工12月比赛A题

题目:

Problem A: 孙壕请一盘青岛大虾呗
Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 380  Solved: 164


Description
话说那一年zstu与gdut进行了一场PK赛,很侥幸的zstu赢了。按照约定,gdut的孙壕得请客。大家呼声很高,均高呼:“孙壕请一盘青岛大呗!”
作为gd的一壕,孙壕爽快的答应了。不过zsj说光吃大虾怎么能过瘾,酒是必须上的。说罢,zsj拿出了2瓶赊店老酒。然而2瓶酒显然不能满足大的要求。xs提议青岛大街走一走,逢店加一倍(酒),逢摊吃大虾并喝一瓶(酒)。这一路走过去,遇到店n次,大排档m次,已知最后1次是大排档,大伙正好把酒喝完。请你计算孙壕请客遇到酒店和大排档的次序,合理的次序一共有多少种?


Input
多组测试数据,每组输入2个整数n和m(均不大于10)


Output
对于每组测试数据输出一行,值为符合条件的次序数.


Sample Input
1 3
Sample Output
1
HINT
1 3的情况是:
先大排档 酒由2瓶变1瓶
然后酒店 酒由1瓶变2瓶
然后2次大排档,各喝1瓶,正好喝完

解题思路:本题数据不大(n和m均不大于10)因此,其实暴力跑也是可以接受的,但做的时候感觉比较符合深搜的思路,于是就想顺便用它来复习复习深搜吧,用dfs解决。

AC代码:

#include <iostream>
using namespace std;
int n,m,wine;
int cnt;
void dfs()
{
//	cout<<wine<<" "<<n<<" "<<m<<endl;
	if(wine==1&&n==0&&m==0)
	{
		cnt++;
//		cout<<cnt<<endl;
		return;
	}
//	if(wine==0||n==0||m==0)return;
	if(wine<1025&&wine>0&&n>=0&&m>=0)
	{
		int temp = wine;
		wine--;
		m--;
		dfs();
		m++;
		wine = temp;
		wine*=2;
		n--;
		dfs();
		n++;
		wine = temp;
	}
	else return;
}
int main()
{
	while(cin>>n>>m)
	{
		m--;
		wine=2;
		cnt=0;
		dfs();
		cout<<cnt<<endl;
	}
	return 0;
}






你可能感兴趣的:(算法,ACM)