n的m划分

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 }

猜你喜欢

转载自www.cnblogs.com/fudanxi/p/12297237.html
今日推荐