hdu1664 放苹果(经典简单dfs)


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 
#include 
#include 
#include 
#include 

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,数据结构-各种搜索)