題目:
划分數
有n個無區別的物品,將他們划分成不超過m組,求出划分方法數模M的余數。
限制條件:
1 <= m <= n <= 1000;
2 <= M <= 10000;
輸入: 輸入 n,m,M分別代表n個物品、m個組、對M取模。
輸出: 輸出划分方法數對M取模的余數。
樣例輸入:
4 3 1000
樣例輸出:
4
所有可能的情況都可以看作是把n划分成m份。只是有的是取0的。
思路:
定義題目為n的m划分數。
dp[i][j]表示 j 的 i 划分數。
分類討論:
1.j >= i時,dp[i][j] = dp[i-1][j]( j的i-1划分,相當於當前位取0的全部情況 ) + dp[i][j-i](當前位不取0,先把每一個置為1,再將剩下的j-i分下去);
2.j < i時,dp[i][j] = dp[i-1][j]; 當前位只能取0。
注意,j的i划分表示的意義為 j固定,i可以取到1-i。
代碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int dp[1010][1010]; int main() { int n,m,mod; cin >> n >> m >> mod; for(int i = 1;i <= m; i++){ for(int j = 0;j <= n; j++){ if(j - i >= 0){ dp[i][j] = (dp[i-1][j] + dp[i][j-i])%mod; }else{ dp[i][j] = dp[i-1][j]; } } } cout << dp[m][n] << endl; return 0; }