描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。

输入
标准的输入包含若干组测试数据。每组测试数据是一行输入数据,包括两个整数N 和 K。
(0 < N <= 50, 0 < K <= N)
输出
对于每组测试数据,输出以下三行数据:
第一行: N划分成K个正整数之和的划分数目
第二行: N划分成若干个不同正整数之和的划分数目
第三行: N划分成若干个奇正整数之和的划分数目
样例输入
5 2
样例输出
2
3
3

分析
第二行:求若干个不相同的正整数之间的划分,状态及状态转移类似(唯一区别选j后剩余可选数字变成1 到 (j - 1))简单整数划分,利用状态d[i][j]表示从1-j中若干个数凑i,且每个数无限取。递推时注意边界处的状态转移方程,当i == j时,d[i][j] = d[i][j - 1] + 1。
第一行:划分为k个整数,使用状态d[i][j]表示将i划分为j个整数,转移方式分为选取1的划分数目: d[i - 1][j - 1](选1后,总数自然要减1,划分的个数也少1)和不选取1的划分数目:d[i - j][j](不选1,意味着每个位置上的数都要大于1,首先j个位置每个位置都至少为1,总数减少j,然后将i - j继续在j个位置划分),最后两者相加即可,注意边界,当i == j时,d[i][j] = 1(或者直接初始化dk[0][0] = 1,慢一些)。
第三行:划分为若干个奇数,借用上面的思想,使用状态dodd[i][j]表示将i划分为j个奇数,deven[i][j]表示将i划分为若干个偶数。状态转移同样分为选
1的个数:对于奇数,选1后,剩余数值i - 1,划分为j - 1个奇数,对于偶数,不能选1。不选1的个数:对于奇数,同上,将1铺好后,只能选j个偶数,对于偶数反之。边界为deven[0][0] = 1,dodd[0][0] = 1(当然可以使用上面那种初始化方法,就是稍微繁琐一些,但是更快)。

#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 55;
int dk[MAX][MAX];
int dd[MAX][MAX];
int dod[MAX][MAX],dev[MAX][MAX];
int main(){ int n,k,i,j;while(scanf("%d%d",&n,&k) != EOF){memset(dk,0,sizeof(dk));memset(dd,0,sizeof(dd));memset(dev,0,sizeof(dev)); memset(dod,0,sizeof(dod));dod[0][0] = 1;dev[0][0] = 1;for(i = 1;i <= n; ++i){for(j = 1;j <= i; ++j){if(i == j){dd[i][j] = dd[i][j - 1] + 1;dk[i][j] = 1;}else{dd[i][j] = dd[i][j - 1] + dd[i - j][min(i - j,j - 1)];dk[i][j] = dk[i - j][j] + dk[i - 1][j - 1];}   dev[i][j] = dod[i - j][j];dod[i][j] = dev[i - j][j] + dod[i - 1][j - 1];}}int sum = 0;for(i = 0;i <= n; ++i)sum += dod[n][i];printf("%d\n%d\n%d\n",dk[n][k],dd[n][n],sum);}return 0;
}

百练#4119复杂的整数划分相关推荐

  1. 百练 04 简单的整数划分问题

    百练 04 简单的整数划分问题 总时间限制: 内存限制: 100ms 65536kB 描述 将正整数nn表示成一系列正整数之和,n=n1+n2+-+nkn=n_1+n_2+-+n_k, 其中n1> ...

  2. 百练 03 复杂的整数划分问题

    百练 03 复杂的整数划分问题 总时间限制: 内存限制: 200ms 65536kB 描述 将正整数nn表示成一系列正整数之和,n=n1+n2+-+nkn=n_1+n_2+-+n_k, 其中n1> ...

  3. 整数划分问题 递归 动态规划 openjudge 百练 python

    4117:简单的整数划分问题 http://bailian.openjudge.cn/practice/4117 4119:复杂的整数划分问题 http://bailian.openjudge.cn/ ...

  4. 百练OJ:4003:十六进制转十进制(python三行代码实现)

    题目链接:百练OJ:4003 描述 将十六进制数转换成十进制数 输入 第一行有一个整数T,表示共有T组数据 接下来T行,每一行为一个16进制无符号正整数,位数不超过8位,数中的a-f均为大写字母,数前 ...

  5. 百练OJ:2973:Skew数

    题目链接: 百练OJ:2973:Skew数 描述:在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1). 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, ...

  6. 百练 求排列的逆序数

    百练 求排列的逆序数 总时间限制: 内存限制: 1000ms 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信 ...

  7. 百练 06 股票买卖

    百练 06 股票买卖 总时间限制: 内存限制: 1000ms 65536kB 描述 最近越来越多的人都投身股市,阿福也有点心动了.谨记着"股市有风险,入市需谨慎",阿福决定先来研究 ...

  8. 百练 05 切割回文

    百练 05 切割回文 总时间限制: 内存限制: 1000ms 65536kB 描述 阿福最近对回文串产生了非常浓厚的兴趣. 如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文 ...

  9. 百练(十三~十六)题解

    百练(十三) Bailian2806 公共子序列[最长公共子序列+DP] - 海岛Blog - CSDN博客 Bailian3143 验证"歌德巴赫猜想"[筛选法]_海岛Blog- ...

最新文章

  1. zeptojs-跑马灯效果
  2. 吐槽C++:C++ 类成员变量初始化 之 初始化带有参数的构造函数 的类成员变量。...
  3. 4.1 matlab二维曲线绘图方法
  4. 全球及中国临床试验支持服务行业十四五规模发展及应用前景调研报告2022-2027年
  5. 4.编程打印一个二维数组中所有元素的和,并打印最大值,最小值(以及它们所在的行号和列号)
  6. OMNet++ 4.0
  7. (四)JS基础知识一(深入分析变量类型和计算)【不会变量,别说你会JS】
  8. OSX EI Captain中安装Pear等三方软件不成功的解决方法
  9. RQNOJ 34 紧急援救
  10. Java生成随机数的几种方式
  11. python官网下载步骤-windows下载并安装Python的具体步骤
  12. 微信小程序——云开发实现图片上传到云存储并实时预览当前上传的图片
  13. 如何创建网站 网站的创建方法
  14. 一款二维码签到app
  15. 微信支付服务商,可视化进件特约商户
  16. Bootstrap笔记5—关闭图标、浮动
  17. [Warning] World-writable config file ‘/etc/mysql/conf.d/my.cnf‘ is ignored.
  18. 面试常问VueX是什么?
  19. win7计算机管理找不到文件夹,win7系统中电脑文件夹选项不见了的具体解决方法...
  20. 爬虫百战穿山甲(5)用大并发的手段批量爬取小图片

热门文章

  1. FPGA设计中约束设计和时序分析方法
  2. 数据结构十大经典排序算法总结
  3. php输入文本框样式,【js】:检测用户输入、文本框默认样式设置、设计表格样式实现全选反选...
  4. 无法识别U盘的解决办法
  5. java i o是什么流_【Java】I/O流的操作、认识使用
  6. Linux 后台开发常用调试工具
  7. C6000的C语言优化
  8. 企业邮件注册,手机怎么注册邮箱?
  9. RPA手把手——写 Python 时要避免的十个错误
  10. unity 3D脚本中文乱码解决方法