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

Openjudge 原题网址:Bailian2014研究生推免上机考试(校内)

原题:

  Description

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

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

  有关这三种变形问题的具体解释在我的另一篇随笔中有提及:整数划分问题-解法汇总,看不懂Code的ACMer见这篇随笔。

  

  Code如下:

  

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5.  
  6. #define MAX 51
  7.  
  8. int dp1[MAX][MAX];
  9. int dp2[MAX][MAX];
  10. int dp3[MAX][MAX];
  11.  
  12. /*划分成K个整数*/
  13. void DP1()
  14. {
  15. for (int n = ; n < MAX; n++)
  16. {
  17. for (int k = ; k < MAX; k++)
  18. {
  19. if (n == k || k == )
  20. dp1[n][k] = ;
  21. else if (n > k)
  22. dp1[n][k] = dp1[n - k][k] + dp1[n - ][k - ]; //划分中不包含1 + 划分中至少有一个1
  23. }
  24. }
  25. }
  26.  
  27. /*划分成<=m的不同整数*/
  28. void DP2()
  29. {
  30. for (int n = ; n < MAX; n++)
  31. {
  32. for (int m = ; m < MAX; m++)
  33. {
  34. if (n > m) //除m外的数不包括m(即剩下划分总和为n-m中没有m)
  35. dp2[n][m] = dp2[n - m][m - ] + dp2[n][m - ];
  36. else if (n < m)
  37. dp2[n][m] = dp2[n][n];
  38. else
  39. dp2[n][m] = + dp2[n][m - ];
  40. }
  41. }
  42. }
  43.  
  44. /*划分成<=m的奇正整数*/
  45. void DP3()
  46. {
  47. for (int n = ; n < MAX; n++) //+1不会增加种类
  48. {
  49. for (int m = ; m < MAX; m+=)
  50. {
  51. if (n > m)
  52. dp3[n][m] = dp3[n - m][m] + dp3[n][m - ];
  53. else if (n < m)
  54. dp3[n][m] = dp3[n][n];
  55. else
  56. dp3[n][m] = + dp3[n][m - ];
  57. dp3[n][m + ] = dp3[n][m];
  58. }
  59. }
  60. }
  61.  
  62. int main()
  63. {
  64. DP1();
  65. DP2();
  66. DP3();
  67. int num, k;
  68. while (scanf("%d%d", &num, &k) != EOF)
  69. {
  70. printf("%d\n", dp1[num][k]);
  71. printf("%d\n", dp2[num][num]);
  72. printf("%d\n", dp3[num][num]);
  73. }
  74.  
  75. return ;
  76. }

小墨-原创

2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)的更多相关文章

  1. CSU计算机研究生推免

    考研复习 一开始,我是没有想到能够拿到研究生推免资格的,从今年3月份到整个暑假过完,一共6个月的时间,我一直在准备考研. 具体来说,我是在准备考研数学,整整6个月时间的数学复习,给我一种感觉,把大一大 ...

  2. 大概是:整数划分||DP||母函数||递推

    整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...

  3. 保研机试训练[bailianoj]

    site:http://bailian.openjudge.cn/xly2018/ 1.计算任意两天之间的天数 思路:以0为起始点计算天数,然后相减即可.这样的编码复杂度会减少很多. #include ...

  4. 2018届研究生招生预推免(THU,HIT)经历分享——guochengtao

    注:本文为作者原创文章,且为无偿分享,读者可以阅读,但请尊重劳动成果,勿作为商业用途!如对文章中的内容有意见或者出现了您不喜欢的言论,请您保留,谢谢合作! 又到一年12月,这代表着2017年已经接近尾 ...

  5. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  6. 2014华为机试西安地区A组试题

    2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...

  7. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

  8. 北邮14&18年软院机试【参考】答案

    2014 Problem A. 奇偶求和 题目描述: 给定N个数,分别求出这N个数中奇数的和以及偶数的和. 输入格式 第一行为测试数据的组数T(1<=T<=50).请注意,任意两组测试数据 ...

  9. java机试要点

    Java机试准备 一般结构:   import java.util.Scanner; public class Main{ public static void main(String[] args) ...

随机推荐

  1. 【8-16】Android学习笔记01

    Android目录树 Activity 生命周期 创建一个 Activity 在 android 中创建一个 Activity 要编写一个继承自 android.app.Activity的 Java ...

  2. ADB常用命令(Android Debug Bridge)

    首先要配置环境变量. adb devices 列出所有的设备 adb start-server 开启adb服务 adb kill-server    关闭adb服务 adb logcat    查看L ...

  3. 大熊君大话NodeJS之------Global Objects全局对象

    一,开篇分析 在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了,G ...

  4. XMAL语法系列之-(2)---WPF控件继承图

    WPF控件继承图 1 FrameworkElement 1.1 Panel(面板类元素) 1.1.1 Canvas 1.1.2 DockPanel 1.1.3 Grid 1.1.4 TabPanel ...

  5. 2015Summer Training #2

    暑假集训昨天刚开始,14级的小伙伴快到齐了,hhhhh ,毕竟下学期区域赛,对我们来说还是很困难的. 打算每天写份总结. UVA 11300 C.Spreading the Wealth 题目大意:n ...

  6. oracle数据表创建分区与查询

    场景: 遇到1亿数据量的数据需要根据用户名做些数据统计分析,想直接做些聚合计算基本没可能,于是打算先根据日期按照年月创建分区,然后对各个分区分别进行统计,最后汇总结果. 有两种方法,分别是手工设置分区 ...

  7. Timestamp 使用

    Timestamp是一个长整形的类型 1.使用方法一 Timestamp nowdate1 = new Timestamp(System.currentTimeMillis()); System.ou ...

  8. linux 中断理解

    1.进程.线程只针对的是应用层,而内核调用.驱动没有这种概念,调用的都是内核调用里相同的函数或变量,所以应用层多个应用操作同个硬件时,特别是要加互斥操作,8250通过cs针脚决定发送数据给哪个串口 2 ...

  9. C语言各种标准的

    [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版(按照惯例 ...

  10. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...