n的m划分:
dp[i][j]表示j的i划分,也就是将j颗球放入i个袋子里面,最后的答案是dp[m][n]
状态转移方程为dp[i][j]=dp[i-1][j]+dp[i][j-i];
划分方法有两种:①有的袋子不放球:dp[i-1][j],比如n=4,m=3,那么可以有2+2或者1+3或者4的方法分完四颗球,i-1表示至少有一个袋子不放球,j表示一共有j颗球
②所有的袋子都不为空,至少有一颗球:dp[i][j-i],也就是1+1+2的方法,i表示每个袋子都放球,
j-i表示每个袋子都放上一颗球之后剩下j-i颗球
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<queue> 5 #include<map> 6 #include<vector> 7 #include<set> 8 #include<string> 9 #include<cmath> 10 #include<cstring> 11 using namespace std; 12 int n,m,M; 13 int dp[1010][1010]; 14 void solve() 15 { 16 dp[0][0]=1; 17 for(int i=0;i<=m;i++) 18 { 19 for(int j=0;j<=n;j++) 20 { 21 if(j-i>=0) 22 { 23 dp[i][j]=(dp[i][j-i]+dp[i-1][j])%M; 24 } 25 else 26 { 27 dp[i][j]=dp[i-1][j]; 28 } 29 } 30 } 31 printf("%d\n",dp[m][n]); 32 } 33 int main() 34 { 35 scanf("%d%d%d",&n,&m,&M); 36 solve(); 37 return 0; 38 }
来源:https://www.cnblogs.com/fudanxi/p/12297237.html