题目描述
June is the month for leaving. Many graduates have to leave colleage and they need to pick up their own things. TT is one of the graduates. He has M same books and N same boxes. He needs to divide these books into K(0<K<=N) groups and put them into the boxes. What's more, the boxes are allowed to be empty and are able to set as many books as he wants.
For example, now TT has 5 books and 3 boxes. (1,3,1),(1,1,3) and (3,1,1) are considered as the same division.
Can you calculate how many divisions TT has.
输入
The input files consists of several test cases. Each test case has two integers M and N.(0<M<=300, 0<N<=300)
输出
Output the answer for each test case in a single line.
样例输入
5 3
3 2
样例输出
5
2
提示
Take (M=3,N=2) for example, it has 2 division (3,0) and (1,2).
觉得这道题也很巧妙,题目要我们求得是将一个数分为若干块 问最多能分几块。
我们将求将一个数分为n块转化为将一个数分为最大块为n的方法,他们两个是等价的,可以用ferrers图证明。
任何将n分为m块的方法都可以画成ferrers图:
F[n][m]=F[n-m][m]+F[n-m][m-1]+F[n-m][m-2]+········+F[n-m][1]
由于F[n-1][m-1]=F[n-m][m-2]+······+F[n-m][1],
于是上面的公式可以化简为:F[n][m]=F[n-m][m]+F[n-1][m-1]
我的代码:
using namespace std;
long long f[301][301];
int main (){
long long n,m;
f[0][0]=1;
for (int i=1;i<=300;i++)
for (int j=1;j<=300;j++)if (i>=j){
f[i][j]=f[i-j][j]+f[i-1][j-1];
}
while (scanf("%lld%lld",&n,&m)!=EOF){
long long ans=0;
for (int i=1;i<=m;i++) ans+=f[n][i];
printf("%lld\n",ans);
}
return 0;
}