nssl1247-A【dp】

xiaoxiao2025-04-16  11

正题


题目大意

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


解题思路

其实就是将n划分成k份,要求前面份的大于等于后面的,所以我们可以写dp f i , j f_{i,j} fi,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} fi,j=fi1,j1+fi,ji f i − 1 , j − 1 f_{i-1,j-1} fi1,j1表示分出一个,值为1 f i , j − i f_{i,j-i} fi,ji表示前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]); }
转载请注明原文地址: https://www.6miu.com/read-5028431.html

最新回复(0)