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

    问题描述

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

    限制条件

    1 <= m <= n <= 1000

    2 <= m <= 10000

    声明 将n 分成m 堆 这样称作 n的m划分

    定义dp[i][j] i 的 j划分的个数

    递推过程

    考虑n的m划分ai(a0 +a1 + ... + am = an) > 0 

    那么{ai-1}就对应着n-m 的 m 划分

    如果有ai = 0 那么就对应了n 的 m-1划分

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

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 using namespace std;
     5 
     6 int n, m, M;
     7 int dp[1007][1007];
     8 int main()
     9 {
    10     freopen("in.txt", "r", stdin);
    11     scanf("%d%d%d", &n, &m, &M);//n划分为不超过 m堆
    12     memset(dp, 0, sizeof(dp));
    13     dp[0][0] = 1;//0分到0堆 个数为1
    14     //dp[i][j] --->>> j的i划分
    15     for (int i = 1; i <= m; i++)
    16     {
    17         for (int j = 0; j <= n; j++)
    18         {
    19             if (j - i >= 0) dp[i][j] = dp[i-1][j] + dp[i][j-i];
    20             else dp[i][j] = dp[i-1][j];
    21         }
    22     }
    23     cout << dp[m][n] << endl;
    24     return 0;
    25 }
  • 相关阅读:
    单(single)
    cdq分治
    寿司
    qtth
    二分,倍增的一些思考(lost my music:可持久化栈)
    手写堆、哈希表
    保留字,关键字
    测试19,20,21
    要买的书
    测试18:T2:可爱精灵宝贝
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6380356.html
Copyright © 2011-2022 走看看