zoukankan      html  css  js  c++  java
  • 划分数

    有n个无区别的物品,将它们划分成不超过m组,求出划分方法数模M的余数

    1<=m<=n<=1000   2<=M<=10000

    这样的划分称作n的m划分

    dp[i][j]:j的i划分的总数

    考虑n的m划分a1,a2...am 如果对于每个i都有ai>0,那么{ai-1}就对应了n-m的m划分。如果存在ai=0,就对应了n的m-1划分

    所以dp[i][j]=dp[i][j-i]+dp[i-1][j]

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<memory.h>
     4 #define INF 10000000
     5 using namespace std;
     6 const int max_n=1001;
     7 int n,m,M;
     8 int main()
     9 {
    10     cin>>n>>m>>M;
    11     int dp[m+1][n+1];
    12     memset(dp,0,sizeof(dp));
    13     dp[0][0]=1;
    14     for(int i=1;i<=m;i++)
    15     {
    16         for(int j=0;j<=n;j++)
    17         {
    18             if(j-i>=0)
    19             {
    20                 dp[i][j]=(dp[i][j-i]+dp[i-1][j])%M;
    21             }
    22             else
    23             {
    24                 dp[i][j]=dp[i-1][j];
    25             }
    26         }
    27     }
    28     cout<<dp[m][n]<<endl;
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    [noip2010]关押罪犯 并查集
    双栈排序 noip2008
    欧拉函数
    中国剩余定理(孙子定理)
    求组合数
    线性素数筛
    洛谷 P2661 信息传递
    图的最短路
    Mzc和男家丁的游戏
    最佳旅游线路
  • 原文地址:https://www.cnblogs.com/wangkaipeng/p/6430483.html
Copyright © 2011-2022 走看看