N划分成若干个奇正整数之和的分法有多少种---动态规划
本文只是对:
OJ 7219 复杂的整数划分各变形题总结__动态规划(别人写的)
里的把N划分成若干个奇正整数之和的分法有多少种的个人理解(在最下方)。
1、截个图做笔记先
#include <iostream>
#include <cstring>
using namespace std;
#define N 51
int dp1[N][N]; //N划分成K个正整数之和的划分数目。
int dp2[N][N]; //N划分成若干个不同正整数之和的划分数目。
int dp3[N][N]; //N划分成若干个可相同的正整数之和的划分数目。
int f[N][N]; //N划分成K个奇正整数之和的划分数目。
int g[N][N]; //N划分成K个偶正整数之和的划分数目。void initDivideInt() {memset(dp1, 0, sizeof(dp1)); //dp[n][k]=dp[n-k][k]+dp[n-1][k-1]memset(dp2, 0, sizeof(dp2)); //dp[n][m]=dp[n][m-1]+dp[n-m][m-1]memset(dp3, 0, sizeof(dp3)); //dp[n][m]=dp[n][m-1]+dp[n-m][m]for (int i = 1; i < N; i++) {for (int j = 1; j < N; j++) {if (i < j) {dp1[i][j] = 0;dp2[i][j] = dp2[i][i];dp3[i][j] = dp3[i][i];}else if (i == j) {dp1[i][j] = 1;dp2[i][j] = dp2[i][j - 1] + 1;dp3[i][j] = dp3[i][j - 1] + 1;}else {dp1[i][j] = dp1[i - j][j] + dp1[i - 1][j - 1];dp2[i][j] = dp2[i][j - 1] + dp2[i - j][j - 1];dp3[i][j] = dp3[i][j - 1] + dp3[i - j][j];}}}
}//f[i][j]=f[i-1][j-1]+g[i-j][j]
void initDivideOdd() {f[0][0] = 1;g[0][0] = 1;for (int i = 1; i < N; i++) {for (int j = 1; j <= i; j++) {g[i][j] = f[i - j][j];f[i][j] = f[i - 1][j - 1] + g[i - j][j];}}
}int main() {// freopen("in.txt", "r", stdin);int n, k;initDivideInt();initDivideOdd();while (cin >> n >> k) {cout << dp1[n][k] << endl;cout << dp2[n][n] << endl;int sum = 0;for (int i = 0; i <= n; i++) {sum += f[n][i];}cout << sum << endl;}return 0;
}
以下为本人理解:
N划分成若干个奇正整数之和:
设f[i][j]
表示将数i
分成j
个正奇数,g[i][j]
表示将数i分成j个正偶数。
因为f[i][j]
表示数i
分成j
个正奇数,假设把这j
个划分每个加个1
,因为奇数减加1
即为偶数,所以这j
个划分都变成了正偶数,所以把i-j
划分成j
个正奇数对应着把i
划分成j
个正偶数,即:f[i-j][j] = g[i][j]
同理可得:把i-j
划分成j
个正偶数对应着把i
划分成j
个正奇数,即g[i-j][j]=f[i][j]
对于正奇数的划分分两种情况:
- 划分中不包含
1
:则要求每个数都大于1
,可以先拿出j
个1
分到每一份,然后将i-1
分成j
个偶数分到没一份,分法有g[i-j][j]
种(分不了就是0
)。 - 划分中包含
1
:则从i
中减去1
,然后从i-1
中再划分j-1
份,
则划分数为f[i-1][j-1]
。
f[i][j]
的动态转移方程:f[i][j]=f[i-1][j-1]+g[i-j][j]
。
因为f[i][j]
和g[i][j]
有f[i-j][j] = g[i][j]
和g[i-j][j]=f[i][j]
的等价关系所以可以通过f[i][j]
来求g[i][j]
//f[i][j]=f[i-1][j-1]+g[i-j][j]
int f[N][N];
int g[N][N];
void initDivideOdd() {f[0][0] = 1;g[0][0] = 1;for (int i = 1; i < N; i++) {for (int j = 1; j <= i; j++) { //为什么小j <= i?因为i<j的话,g[i][j]和f[i][j]都只能为0g[i][j] = f[i - j][j];f[i][j] = f[i-1][j-1] + g[i-j][j];}}
}
如果要求把n(n < N)
划分成若干个奇正整数之和的分法有多少种的话,还要把f[i][j]
数组的第n
行(不是n-1
,因为从第一行算起的)的累加起来,因为f[i][j]
的含义是将数i
分成j
个正奇数,而这里没指定要划分成几个。
N划分成若干个奇正整数之和的分法有多少种---动态规划相关推荐
- 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个?...
2014下半年网络工程师 上午试卷 综合考试 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个? A.100 B.64 C.128 D.500 解析:因为需要1000 ...
- NYOJ 90 —— 求正整数n划分为若干个正整数的划分个数
整数划分 时间限制:3000 ms | 内存限制:65535 KB 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk, 其中n1≥n2≥-≥nk≥1,k≥1. 正整数n的这种表 ...
- 将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大
#include<iostream> #include<cstdio> using namespace std; //把自然数N分解成若干个互不相同的正整数,使乘积最大: /* ...
- 整数分解成若干项之和(DFS)拓展延伸
在深度优先搜索的例题中,有一种题型是整数分解成若干项之和. 例如将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=1+6,7=2+5,7=1+1+5,-.编程求出正整数N的所有整数分解式 ...
- 枚举求解:试把一个正整数n拆分为若干个(不少于2个)连续正整数之和。例如:n=15,有3种拆分:15=1+2+3+4+5,15=4+5+6,15=7+8。 对于给定的正整数n,求出所有符合这种拆分要求
试把一个正整数n拆分为若干个(不少于2个)连续正整数之和.例如:n=15,有3种拆分:15=1+2+3+4+5,15=4+5+6,15=7+8. 对于给定的正整数n,求出所有符合这种拆分要求的连续正整 ...
- 正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大
题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3 4=1+3,5=1+4=2+3,6=1+5=2+4. 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然 ...
- 7-37 整数分解为若干项之和 (20 分)(dfs)
7-37 整数分解为若干项之和 (20 分) 将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,-.编程求出正整数N的所有整数分解式子. 输入格式: ...
- 数论概论读书笔记 25.哪些数可表成两个平方数之和
哪些数可表成两个平方数之和 对于一个正整数mmm ,如果m" role="presentation">mmm每个素因子都可以表示成两个平方数之和,则素因子分解后,用 ...
- 一个物理CPU如何划分成多个虚拟CPU
原文链接:一个物理CPU如何划分成多个虚拟CPU 问题:一个虚拟机可以分配多少个虚拟CPU,以及如何在服务器上限制虚拟机的数量? 一个物理CPU一般一个内核会支持多个处理线程(英特尔超线程技术).这就 ...
最新文章
- python gui框架_Python的GUI框架PySide的安装配置教程
- 基于Jquery插件Uploadify实现实时显示进度条上传图片
- CSS设置超出表格的内容用省略号显示
- vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
- 手机技巧:手机丢了记住这四步操作,让你的损失降到最低!
- Xamarin效果第一篇之时间轴
- 【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题
- Firefox for iOS现身Github 使用Swift编写
- IOPS和Throughput
- (转)Low-Mid-High
- python连续小波变换_连续小波变换CWT(2)
- vim个性化设置---给脚本文件加注释头信息
- 我的世界服务器起床地图维修,Minecraft·起床战争地图更新来了!地图“雪仗”全面解读!...
- 神经网络为什么叫神经网络【一文看懂】
- 插件!最好用的翻译插件!!
- Python中 os.sep 的作用
- 解决windows 10在联网时依旧无法安装3DMAX2014
- java 邮件 加密_基于Java的邮件加密解密
- linux运维之批量升级
- 怎么才能戒烟最好的方法,这样戒烟最有效
热门文章
- python从入门到精通 明日科技 电子书-【明日科技+python】百度云下载 - 云盘精灵...
- 为什么都建议学java而不是python-为什么java比python复杂,还是有很多人选择学习java?...
- micropython入门教程-如何学习MicroPython MicroPython入门知识
- python语言入门-Python语言入门详解!快速学成Python!
- 盘点语音识别技术在人工智能中的应用
- 一种基于地图导航的语音识别管理系统的制作方法
- 简析语音识别技术的工作原理
- 第J题-=数组中等于K的数对(详解) =======给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数
- 前端面试知识点归纳:vue,react,webpack,bable,项目开发
- Python笔记:Python中的main函数