题目大意;
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
解题思路:
一个大水题,可以写递归,也可以用动态规划的思想写转移方程,在讨论区看到有的人是用搜索做的,不过我没想到,所以只提供一下两种代码。
DP版本
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
const int maxn = 20 + 5;
int dp[maxn][maxn];
int m,n;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>m>>n;
for(int i=0;i<maxn;i++)
dp[i][0]=dp[i][1]=dp[0][i]=dp[1][i]=1;
for(int i=2;i<=m;i++)
for(int j=2;j<=n;j++)
{
if(i>=j)
dp[i][j]=dp[i][j-1]+dp[i-j][j];
else
dp[i][j]=dp[i][i];
}
cout<<dp[m][n]<<endl;
}
return 0;
}
递归版本:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m,n;
int f(int x,int y)
{
if(x<y) y=x;
if(x==1||x==0)
return 1;
if(y==1)
return 1;
return f(x,y-1)+f(x-y,y);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&m,&n);
printf("%d\n",f(m,n));
}
return 0;
}