您的位置:首页 > 其它

hdu1664 放苹果(经典简单dfs)

2016-05-23 19:56 363 查看
http://poj.org/problem?id=1664

题意:经典的m个苹果分给n个盘,求问多少种分发。

思路:刚开始想用并查集做这题,后来才知到居然深搜就行。既然是深搜,就要全部情况都考虑好,边界也要处理好。

搜索终止条件,苹果树为1,那只有一种了;盘子为1,那全放进去,也是一种;当苹果数为0,题目中说允许有盘子空着不放,那这也算一种= =[金馆长脸]。

然后考虑边界,当m比n小,那剩余的盘子相当于无效,就继续dfs(m, m);

当m大于等于n的时候,就是我们平常的放法。而我们平常放时就有放满和不满的情况,不满的就dfs(m, n-1)继续往下搜,满的就dfs(m-n, n)往下搜。

ps:搜索这种题。。必须找到边界条件才能做,边界条件就很难找啊,以前上学时候哪有题是这样的,哎得多练。这题就是赤裸裸考你找边界,很好一道题,锻炼了思维。

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

typedef long long LL;

const int N = 100010;
const int INF = 0x3f3f3f3f;

int dfs(int m, int n)
{
if(m == 1 || n == 1 || m == 0) return 1;
if(m < n)
return dfs(m, m);
else
return dfs(m, n-1)+dfs(m-n, n);
}

int main()
{
// freopen("in.txt", "r", stdin);
int t, m, n, ans;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &m, &n);
ans = dfs(m, n);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj