【算法】划分數 動態規划


題目:

划分數

有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;  
}   

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM