本文只是对:
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,可以先拿出j1分到每一份,然后将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划分成若干个奇正整数之和的分法有多少种---动态规划相关推荐

  1. 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个?...

    2014下半年网络工程师 上午试卷 综合考试 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个? A.100 B.64 C.128 D.500 解析:因为需要1000 ...

  2. NYOJ 90 —— 求正整数n划分为若干个正整数的划分个数

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,  其中n1≥n2≥-≥nk≥1,k≥1.  正整数n的这种表 ...

  3. 将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大

    #include<iostream> #include<cstdio> using namespace std; //把自然数N分解成若干个互不相同的正整数,使乘积最大: /* ...

  4. 整数分解成若干项之和(DFS)拓展延伸

    在深度优先搜索的例题中,有一种题型是整数分解成若干项之和. 例如将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=1+6,7=2+5,7=1+1+5,-.编程求出正整数N的所有整数分解式 ...

  5. 枚举求解:试把一个正整数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,求出所有符合这种拆分要求的连续正整 ...

  6. 正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大

    题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3 4=1+3,5=1+4=2+3,6=1+5=2+4. 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然 ...

  7. 7-37 整数分解为若干项之和 (20 分)(dfs)

    7-37 整数分解为若干项之和 (20 分) 将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,-.编程求出正整数N的所有整数分解式子. 输入格式: ...

  8. 数论概论读书笔记 25.哪些数可表成两个平方数之和

    哪些数可表成两个平方数之和 对于一个正整数mmm ,如果m" role="presentation">mmm每个素因子都可以表示成两个平方数之和,则素因子分解后,用 ...

  9. 一个物理CPU如何划分成多个虚拟CPU

    原文链接:一个物理CPU如何划分成多个虚拟CPU 问题:一个虚拟机可以分配多少个虚拟CPU,以及如何在服务器上限制虚拟机的数量? 一个物理CPU一般一个内核会支持多个处理线程(英特尔超线程技术).这就 ...

最新文章

  1. python gui框架_Python的GUI框架PySide的安装配置教程
  2. 基于Jquery插件Uploadify实现实时显示进度条上传图片
  3. CSS设置超出表格的内容用省略号显示
  4. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
  5. 手机技巧:手机丢了记住这四步操作,让你的损失降到最低!
  6. Xamarin效果第一篇之时间轴
  7. 【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题
  8. Firefox for iOS现身Github 使用Swift编写
  9. IOPS和Throughput
  10. (转)Low-Mid-High
  11. python连续小波变换_连续小波变换CWT(2)
  12. vim个性化设置---给脚本文件加注释头信息
  13. 我的世界服务器起床地图维修,Minecraft·起床战争地图更新来了!地图“雪仗”全面解读!...
  14. 神经网络为什么叫神经网络【一文看懂】
  15. 插件!最好用的翻译插件!!
  16. Python中 os.sep 的作用
  17. 解决windows 10在联网时依旧无法安装3DMAX2014
  18. java 邮件 加密_基于Java的邮件加密解密
  19. linux运维之批量升级
  20. 怎么才能戒烟最好的方法,这样戒烟最有效

热门文章

  1. python从入门到精通 明日科技 电子书-【明日科技+python】百度云下载 - 云盘精灵...
  2. 为什么都建议学java而不是python-为什么java比python复杂,还是有很多人选择学习java?...
  3. micropython入门教程-如何学习MicroPython MicroPython入门知识
  4. python语言入门-Python语言入门详解!快速学成Python!
  5. 盘点语音识别技术在人工智能中的应用
  6. 一种基于地图导航的语音识别管理系统的制作方法
  7. 简析语音识别技术的工作原理
  8. 第J题-=数组中等于K的数对(详解) =======给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数
  9. 前端面试知识点归纳:vue,react,webpack,bable,项目开发
  10. Python笔记:Python中的main函数