放苹果(数的拆分)

题意:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

        经典的DP(也可以用递归)

        状态转移方程:f[m][n]=f[m-n][n]+f[m][n-1];一定要做好初始化工作;

      

//状态转移方程:f(m,n)=f(m-n,n)+f(m,n-1);
#include <iostream>
using namespace std;
int f[21][21];
int main()
{
int N;
cin>>N;
while(N--)
{
int m,n;
cin>>m>>n;
if(m<n)
n=m;
int i,j;
for(i=0;i<=m;i++)
{f[i][1]=1;f[1][i]=1;f[0][i]=1;}
for(i=2;i<=m;i++)
for(j=2;j<=n;j++)
{
if(i<j)//此时f[i-j][j]=0;
{
f[i][j]=0+f[i][j-1];
}
else
f[i][j]=f[i-j][j]+f[i][j-1];//如果i-j=0说明j个盘中刚好每盘一个,所以f[0][j]=1;
}
cout<<f[m][n]<<endl;
}
return 0;
}
/*递归方法
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <iomanip>
#include <stdlib.h>
using namespace std;

int PlaceApple(int m, int n)
{
if(m < 0)
return 0;
if(m == 0) //每个盘子一个
return 1;
if(n == 1) //只有一个盘子
return 1;
return PlaceApple(m - n, n) + PlaceApple(m, n - 1);
}

int main()
{
int num,m,n;
cin>>num;
while (num>0)
{
cin>>m>>n;
cout<<PlaceApple(m,n)<<endl;
num--;
}
}
*/

 

posted @ 2012-03-28 14:07  orangeblog  阅读(182)  评论(0编辑  收藏  举报