【题意】将n划分成不同正整数的和的方案数。

【算法】动态规划

【题解】

暴力:f[i][j]:只用前1..i的数字,总和为j的方案数

本质上是01背包,前i个物体,总质量为j的方案数

f[i][j]=f[i-1][j]+f[i-1][j-i]

复杂度O(n^2)

优化:

我们发现,因为要求数字不同,那么数字最多也小于sqrt(n*2)个。

极端情况:1+2+3+...+mx=n mx<sqrt(n*2)

所以可以改一下状态的设计

f[i][j]:用了i个数字,总和为j的方案数。

转移状态:

①如果i个数里没有1:那么把i个数字都-1,就对应“取了i个数字,总和为j-i”的,i个数都+1

②i个数字里有1:对应"取了i-1个数字,总和为j-i"的情况,再加一个新的数字1,其他i-1个数也都+1啊

f[i][j]=f[i-1][j-i]+f[i][j-i]

初始状态f[0][0]=1

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
const long long MOD=;
int f[][maxn],n;
int main()
{
scanf("%d",&n);
f[][]=; for(int i=;i*i<=n*;i++)
for(int j=;j<=n;j++)
if(j-i>=)f[i][j]=(f[i-][j-i]+f[i][j-i])%MOD;
long long ans=;
for(int i=;i*i<=n*;i++)
ans=(ans+f[i][n])%MOD;
printf("%lld",ans);
return ;
}

总结一下几种情况:

1.$f_{n,m}$表示将数字n分成m个非负整数的方案。

$$f_{i,j}=f_{i,j-1}+f_{i-j,j}$$

如果方案中有0就去掉,否则整体-1。

2.$f_{n,m}$表示将数字n分成m个正整数的方案。

$$f_{i,j}=f_{i-1,j-1}+f_{i-j,j}$$

如果方案中有1就去掉,否则整体-1。

3.$f_{n,m}$表示将数字n分成m个不同正整数的方案数。

$$f_{i,j}=f_{i-j,j-1}+f_{i-j,j}$$

强制递增,如果方案第一位是1那么去掉后整体-1,否则整体-1。

【51NOD】1201 整数划分的更多相关文章

  1. 51nod 1201 整数划分 dp

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB   收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...

  2. 51nod 1201 整数划分 基础DP

    1201 整数划分  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} ...

  3. 51Nod 1201 整数划分 (经典dp)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题意不多说了. dp[i][j]表示i这个数划分成j个数 ...

  4. 51nod 1201 整数划分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 DP转移方程:dp[i][j] = dp[i-j][j]+dp[i ...

  5. 51nod p1201 整数划分

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...

  6. 51nod 1201:整数划分 超级好的DP题目

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} { ...

  7. 51nod1201 整数划分

    01背包显然超时.然后就是一道神dp了.dp[i][j]表示j个数组成i的方案数.O(nsqrt(n)) #include<cstdio> #include<cstring> ...

  8. 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)

    这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...

  9. 整数划分 (区间DP)

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

随机推荐

  1. object-oriented 第二次作业(2)

    面向对象程序设计自学计划 由于我的英文实在是很差,所以我就没有去考虑看英文的课程视频.网络上的课程有很多,什么学校的也有,一开始我不知道该如何开始选择课程.感觉每个都还可以.后来在群里的看到别人推荐的 ...

  2. 团队作业7——第二次项目冲刺(Beta版本)

    团队作业7——第二次项目冲刺-Beta版本项目计划 团队作业7——第二次项目冲刺(Beta版本)-第一篇 团队作业7——第二次项目冲刺(Beta版本)-第二篇 团队作业7——第二次项目冲刺(Beta版 ...

  3. iOS APP中第三方APP调用自己的APP,打开文件

    根据需求需要在项目中要打开word.pdf.excel等文件,在info.plist文件中添加 <key>CFBundleDocumentTypes</key> <arr ...

  4. SQL 跨库查询

    使用SQL查询数据,不仅能查询当前库的数据,还可以跨数据库,甚至跨服务器查询. 下面给大家介绍一下跨服务器查询的步骤(以SQL Server为例): 1,建立数据库链接 EXEC sp_addlink ...

  5. 【beta】Scrum站立会议第1次....11.3

    beta阶段,我们nice!团队将进行为期两周的冲刺,Scrum站立会议10次. 小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.1 ...

  6. google go语言开发

    C:cd C:\Program Files\go\gopath\src\opmsset GOOS=linuxset GOARCH=amd64set CGO_ENABLED=0make.batgo in ...

  7. Django 2.0 学习(06):Django 视图(进阶)

    概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...

  8. [洛谷P2106]Sam数

    题目大意:问长度为$n$的$Sam$数有几个,$Sam$数的定义为没有前导零,相邻两个数字之差绝对值小于等于$2$的数 题解:发现转移方程一定,可以矩阵快速幂. 卡点:没有特判$n=1$的情况 C++ ...

  9. MySQL中数据表的基本操纵

    本文基于对国家863中部软件孵化器编著的<MySQL从入门到精通>一书的操作实践.  一.创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句 USE 数据库名  指定操作是在那个 ...

  10. 内存和cpu

    http://www.blogjava.net/fjzag/articles/317773.html ubuntu@ubuntu-vm:/work/sv-g5-application/projects ...