详细的解释放苹果问题的链接:苹果可相同可不同,盘子可相同可不同,盘子可空和不可空,都有详细的说明···

http://www.cnblogs.com/celia01/archive/2012/02/19/2358673.html

不赘述:这里的代码是递归,记忆化搜索,避免重复计算某些数的值```

 #include <cstdio>
#include <cstring>
#define N 50
int d[N][N];
int dfs(int x,int y)//x个苹果放入y个盘子中的放法数
{
if(d[x][y] != -) return d[x][y];
if(x<) return ;//苹果个数小于0
if(x== || y == ) return ;//苹果个数等于0或者盘子个数等于1
return d[x][y] = dfs(x-y,y)+dfs(x,y-);//每个盘子都不为空||至少一个盘子为空
//每个盘子都不为空的方法相当于苹果个数x-n,y个盘子的放法····
}
int main()
{
// freopen("in.c","r",stdin);
int t;
scanf("%d",&t);
memset(d,-,sizeof(d));
while(t--)
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",dfs(m,n));
}
return ;
}

还有二维DP类的

代码:

 #include <cstdio>
#include <cstring>
#define N 50
//#define debug
int d[N][N];
void init()
{
for(int i=; i<N; ++i)
d[][i] = d[][i]=d[i][]=d[i][] =;
for(int i=; i<N; ++i)
{
for(int j=; j<N; ++j)
{
if(i-j >= ) d[i][j] += d[i-j][j];
d[i][j] += d[i][j-];
}
}
#ifdef debug
for(int i=; i<=; ++i)
{
for(int j=; j<=; ++j)
{
printf("%d ",d[i][j]);
}
puts("");
}
#endif
}
int main()
{
#ifdef debug
freopen("in.c","r",stdin);
#endif
init();
int t;
scanf("%d",&t);
while(t--)
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",d[m][n]);
} return ;
}
05-08 08:38