时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB描述
把 \(M\) 个同样的苹果放在 \(N\) 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)\(5,1,1\) 和 \(1,5,1\) 是同一种分法。
输入描述
第一行是测试数据的数目 \(t\)(\(0≤t≤20\))。
以下每行均包含二个整数 \(M\) 和 \(N\),以空格分开。\(1≤M,N≤10\)。输出描述
对输入的每组数据 \(M\) 和 \(N\),用一行输出相应的 \(K\)。
用例输入 1
1 7 3
用例输出 1
8
提示
代码
递归 做法
#include<cstdio>
using namespace std;
int ans=0;
void solve(int m,int n,int p,int last)
{
if(m<0) return;
if(p==n)
{
if(m>=last) ans++;
}
else
{
for(int i=last;i<=m;i++)
solve(m-i,n,p+1,i);
}
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m,n;
scanf("%d%d",&m,&n);
ans=0;
solve(m,n,1,0);
printf("%d\n",ans);
}
return 0;
}
动态规划 做法
#include<cstdio>
#include<cstring>
using namespace std;
const int M=15,N=15;
int T,m,n,f[M][N];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++) f[i][1]=1;
for(int i=1;i<=n;i++) f[0][i]=f[1][i]=1;
for(int i=2;i<=m;i++)
for(int j=2;j<=n;j++)
{
if(i>=j) f[i][j]=f[i][j-1]+f[i-j][j];
else f[i][j]=f[i][i];
}
printf("%d\n",f[m][n]);
}
return 0;
}
标签:last,int,题解,namespace,苹果,ans,include
From: https://www.cnblogs.com/jerrycyx/p/18331308