划分数 (DP)

输入:

n=4

m=3

M=10000

输出:

4 (1+1+2=1+3=2+2=4)

复杂度(nm)

 1 int n,m;
 2 int a[MAX];
 3
 4 int dp[MAX][MAX];  //数组
 5
 6 void solve()
 7 {
 8     dp[0][0]=1;
 9     for(int i=0; i<=m; i++){
10         for(int j=0; j<=n; j++){
11             if(j-i >= 0){
12                 dp[i][j]=(dp[i-1][j]+dp[i][j-i])%M;
13             }
14             else{
15                 dp[i][j]=dp[i-1][j];
16             }
17         }
18     }
19     printf("%d\n",dp[m][n]);
20 }
时间: 2024-08-24 13:34:20

划分数 (DP)的相关文章

计数DP(划分数,多重集组合数)

划分数:把n个无区别的物品划分成不超过m组. dp[i][j]=j的i划分的总数. dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 dp[i][j-i]; 存在有一份以上用0划分dp[i-1][j] int main() { int n,m; cin>>n>>m; dp[0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=n;j++) { if(j>=i)

[ACM] n划分数m部分,它要求每一个部分,并采取了最大的产品(间隔DP)

A - 爱管闲事 春希很爱管闲事,他每天都会抽出时间帮助一些同学,因为春希很死板,出于公平性.春希不会先帮助后来找他的同学. 如今有n个同学须要他的帮助,尽管他非常想一天之类帮助全部人,但毕竟精力有限.于是他决定分m天来帮助他们. 依据事情的重要性,春希帮助不同同学会有不同的快乐值,而春希获得的总的快乐值为每天获得的快乐值的乘积. 如今给出n和m,以及帮助完各同学时获得的快乐值,求春希能获得的最大快乐值. Input 第一行为一个整数T.代表数据组数. 每组数据,第一行两个整数n,m. 表示须要

划分数 不超过m组 dp

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> using namespace s

有关计数问题的DP 划分数

有n个无差别的物品,将它们划分成不超过m组.求出划分方法数模M的余数. 输入: 3 4 10000 输出: 4(1+1+2=1+3=2+2=4) 定义:dp[i][j] = j的i划分的总数 #include <cstdio> #include <algorithm> using namespace std; int n, m, M; int dp[1000][1000]; void solve() { dp[0][0] = 1; for (int i = 1; i <= m

划分数(有关计数类的DP)

1,发现你把这些看起来似乎很抽象的东西,转化成具体的话(比如带进去几个数字)就会很简单.这种对立的转换是不是也..是一种什么. 2,也不一定要先看文字,可以先看代码再看文字.比如上次那个你要是光看文字我估计你肯定看不懂. 3,这个东西有点像套东西,我正着套,我反着套,我从中间套. #include<iostream> using namespace std; int n,m,M; int dp[1005][1005]; int main(){ cin>>n>>m>

hdu 5119 (类似于划分数的状态定义) (DP中的计数问题)

题目描述:求n个数中异或值大于m的方案数有多少个? 设状态f[i][j]代表前i个数异或值为j的方案数有f[i][j]种,那么对于j来说要么选第i个数与前面的i-1个数中的某些数构成j,f[i-1][j^a[i]]],要么不选第i个数,直接由前面的i-1个数构成j,f[i-1][j];  f[i][j]=f[i-1][j^a[i]] + f[i-1][j] ; 注意到j的取值范围为10^6约等于2^(20),所以n个数亦或的最大值最多为20个1. 亦或的特性 : 任何数与0相亦或不变 ,任何数与

划分数系列问题

整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数. 2. 将n划分成k个正整数之和的划分数. 3. 将n划分成最大数不超过k的划分数. 4. 将n划分成若干奇正整数之和的划分数. 5. 将n划分成若干不同整数之和的划分数. 1.将n划分成不大于m的划分法: 1).若是划分多个整数可以存在相同的:  dp[n][m]= dp[n][m-1]+ dp[n-m]

hdu 5230 整数划分 dp

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5230 题意:给定n,c,l,r.求有多少种方法从1~n-1选取任意k数每个数的权重为其下标,使得这些数字之和加上c之后在l,r范围内. 题解:第一反应是计数01包,但是范围给定的n太大,TLE... 然后仔细想想,不就是求l~r范围内不重复的整数划分数嘛. dp[i][j]表示j这个数字,当前的拆分拥有i个拆分数时的方案数. 先考虑允许重复数字 : dp[i][j] = dp[i][j - i] + d

两个本质相同的dp

1.划分数 描述:给定数字N,将其划分为不超过K组,求不同的划分的总数(比如4——1 2 1,2 1 1就算做一种划分) 2.Dollar Dayz 描述:给定数字N,将其随意划分,但是组成数字不可以超过K,求不同的划分总数. 这两者看起来是有不同的. 比如对于N=100 K=30的情况. 第一个不可能出现100个1的组成,但是第二个却完全可以. 那么: 对于第一个: 设方程dp[n][k]是n不超过k的划分,有 dp[n][k]= dp[n][k-1]+ (假如划分份数不为k) dp[n-k]