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;
}