nssl1247-A【dp】

版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/83504167

正题


题目大意

将n个相同球放到k个相同的盒子里,求方案数。


解题思路

其实就是将n划分成k份,要求前面份的大于等于后面的,所以我们可以写dp
f i , j f_{i,j} 表示分成i组,分了j。
然后
f i , j = f i 1 , j 1 + f i , j i f_{i,j}=f_{i-1,j-1}+f_{i,j-i}
f i 1 , j 1 f_{i-1,j-1} 表示分出一个,值为1
f i , j i f_{i,j-i} 表示前i份都加上一

这个方程因为后面加的时候前面也会加,就保证了前面的大于等于后面的。


code

#include<cstdio>
#define ll long long
#define XJQ 998244353
using namespace std;
ll n,m,f[5010][5010];
int main()
{
	scanf("%lld%lld",&n,&m);
	f[0][0]=1;
	for(ll i=1;i<=m;i++)
	  for(ll j=i;j<=n;j++)
	    f[i][j]=(f[i][j-i]+f[i-1][j-1])%XJQ;
	printf("%lld",f[m][n]);
}

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/83504167