http://ac.jobdu.com/problem.php?pid=1160
一眼一看就知道是dp,但是苦于找不到状态转移。网上看到了递推关系,其实很简单:对于m个苹果,n个盘子的摆法,可以分为有空盘和无空盘两类,有空盘类,就是在m,n-1的所有摆法中加入一个空盘,而无空盘类,就是先拿出n个苹果每个盘各摆一个,在分配剩下的苹果。当然,要注意m<n时,n-m个盘子有和没有是没区别的,因为永远用不上。代码如下:
#include <stdio.h>
int dp(int m, int n)
{
if (m==0||n==1) return 1;
if (m<n) return dp(m,m);
else return dp(m,n-1)+dp(m-n,n);
}
int main()
{
int m,n,t;
scanf("%d",&t);
for (int i=0;i<t;++i)
{
scanf("%d %d",&m,&n);
printf("%d\n",dp(m,n));
}
return 0;
}