这个题理解了好大会才理解,看了网上的代码,不太理解,但是后来看了好几个人的, 大同小异吧,慢慢的就理解了。

思路:

递归函数的意思是, 将 n 划分为最大数为 m 的划分数, 可以分几种情况

1. 当n = 1 的时候, 这时候就是将1划分, 也就是递归的出口, 1 肯定只能划分为 1, 所以返回1

2. 当m = 1的时候, 最大的数为1, 所以只能全划分为1才行, 所以就一种,return 1;

3. 当n < m的时候, 一个数肯定不能划分为比他要大的数, 最大只能划分到它本身,所以只需要将m变成n就行了,所以func(n, n);

4. 当n > m 时,根据划分中是否包含最大值 m,可以分为两种情况:

(a). 划分中包含 m 的情况,即 { m, { x1, x2, ..., xi } }, 其中 { x1, x2, ..., xi } 的和为 n - m,可能再次出现 m,因此是(n - m)的 m 划分,因此这种划分

个数为 f(n-m, m);

(b). 划分中不包含 m 的情况,则划分中所有值都比 m 小,即 n 的 ( m - 1 ) 划分,个数为 f(n, m - 1);

因此 f(n, m) = f(n - m, m) + f(n, m - 1);

5.  当 n = m 时,根据划分中是否包含 n,可以分为两种情况:

(a). 划分中包含n的情况,只有一个即 { n };

(b). 划分中不包含n的情况,这时划分中最大的数字也一定比 n 小,即 n 的所有 ( n - 1 ) 划分。

因此 f(n, n) = 1 + f(n, n-1);

大体思路就是这样,不理解的话可以尝试着代入数据试试,理解理解大体概念,下面是代码的实现:

方法一(递归版):

 #include <stdio.h>

 int func(int n, int m)//func(n, m) 是将 n 划分为最大数不超过m的划分
{
if(n == || m == )
return ;
if(n < m)//因为不可能将n划分成比n还大的数,所以,直接m = n就行了
return func(n, n);
else if(n > m)/*当将n划分为比它小的数时,
一个是继续往下再找一个,还有一个就是剩下的那个*/
return func(n, m - ) + func(n - m, m);
else if(n == m)//n = m的时候, 也就是它的上一个的划分加上1
return + func(n, m - );
}
int main()
{
int m;
scanf("%d", &m);
for(int i = ; i < m; i++)
{
int n;
scanf("%d", &n);
printf("%d\n", func(n, n));
}
return ;
}

方法二(dp):

 //dp
#include <stdio.h> const int MAX = ; int main()
{
int dp[MAX + ][MAX + ];
for(int i = ; i <= MAX; i++)
dp[i][] = dp[][i] = ;//初始化
for(int i = ; i <= MAX; i++)
{
for(int j = ; j <= MAX; j++)
{
if(i == j)
dp[i][i] = dp[i][i - ] + ;
else if(i < j)
dp[i][j] = dp[i][i];
else
dp[i][j] = dp[i][j - ] + dp[i - j][j];
}
}
int m, t;
scanf("%d", &m);
for(int i = ; i < m; i++)
{
scanf("%d", &t);
printf("%d\n", dp[t][t]);
}
return ;
}

递归---NYOJ-90整数划分(一)的更多相关文章

  1. nyoj 90 整数划分

    点击打开链接 整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,  其中n1≥n2≥-≥nk≥1,k≥ ...

  2. NYOJ90 整数划分(经典递归和dp)

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

  3. 整数划分 Integer Partition(二)

    本文是整数划分的第二节,主要介绍整数划分的一些性质. 一 先来弥补一下上一篇文章的遗留问题:要求我们所取的 (n=m1+m2+...+mi )中  m1 m2 ... mi连续,比如5=1+4就不符合 ...

  4. 整数划分 Integer Partition(一)

    话说今天百度面试,可能是由于我表现的不太好,面试官显得有点不耐烦,说话的语气也很具有嘲讽的意思,搞得我有点不爽.Whatever,面试中有问到整数划分问题,回答这个问题过程中被面试官搞的不胜其烦,最后 ...

  5. NYOJ-571 整数划分(三)

    此题是个非常经典的题目,这个题目包含了整数划分(一)和整数划分(二)的所有情形,而且还增加了其它的情形,主要是用递归或者说是递推式来解,只要找到了递推式剩下的任务就是找边界条件了,我觉得边界也是非常重 ...

  6. POJ1664(整数划分)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30894   Accepted: 19504 Description ...

  7. poj1664 放苹果(DPorDFS)&&系列突破(整数划分)

    poj1664放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33661   Accepted: 20824 Desc ...

  8. HOJ 1402 整数划分

    HOJ1402 整数划分 http://acm.hit.edu.cn/hoj/problem/view?id=1402 [题目描述] 整数划分是一个经典的问题.希望这道题会对你的组合数学的解题能力有所 ...

  9. nyoj_90_整数划分_201403161553

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

  10. 51nod p1201 整数划分

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

随机推荐

  1. 【USACO 2.2.1】序言页码

    [题目描述] 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 L 50 M 1000 V 5 C 100 X 10 D 500 最多3个同样的可以表 ...

  2. ftp文件操作

    PHP FTP操作类( 上传.拷贝.移动.删除文件/创建目录 ) 2016-06-01 PHP编程 /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ ...

  3. Delphi-LowerCase 函数

    函数名称 LowerCase 所在单元 System.SysUtils 函数原型 function LowerCase(const S: string): string; 函数功能 将字符串中所有的大 ...

  4. Javascript中的onclick事件

    示例: <script type="text/javascript"> function onSubmit() { alert("保存数据"); } ...

  5. Python二分查找

    代码: 时间复杂度:O(log2n) #!/usr/bin/env python #coding:utf-8 import copy from copy import deepcopy ''' def ...

  6. SpEL快速入门

    Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图.与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板. ...

  7. C语言学习笔记--枚举&结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  8. 【Oracle】windows默认共享的打开和关闭?

    Windows启动时都会默认打开admin$ ipc$ 和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢,一般来说有两个地方,MSDOS命令和计 ...

  9. Qt 窗体布局 good

    布局相关对象及简介 窗体上的所有的控件必须有一个合适的尺寸和位置.Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLa ...

  10. 用JvisualVM监视远程tomcat

    在tomcat的catcalina.sh 中java_opts 环境变量中添加以下参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmx ...