递归---NYOJ-90整数划分(一)
这个题理解了好大会才理解,看了网上的代码,不太理解,但是后来看了好几个人的, 大同小异吧,慢慢的就理解了。
思路:
递归函数的意思是, 将 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整数划分(一)的更多相关文章
- nyoj 90 整数划分
点击打开链接 整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk, 其中n1≥n2≥-≥nk≥1,k≥ ...
- NYOJ90 整数划分(经典递归和dp)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正 ...
- 整数划分 Integer Partition(二)
本文是整数划分的第二节,主要介绍整数划分的一些性质. 一 先来弥补一下上一篇文章的遗留问题:要求我们所取的 (n=m1+m2+...+mi )中 m1 m2 ... mi连续,比如5=1+4就不符合 ...
- 整数划分 Integer Partition(一)
话说今天百度面试,可能是由于我表现的不太好,面试官显得有点不耐烦,说话的语气也很具有嘲讽的意思,搞得我有点不爽.Whatever,面试中有问到整数划分问题,回答这个问题过程中被面试官搞的不胜其烦,最后 ...
- NYOJ-571 整数划分(三)
此题是个非常经典的题目,这个题目包含了整数划分(一)和整数划分(二)的所有情形,而且还增加了其它的情形,主要是用递归或者说是递推式来解,只要找到了递推式剩下的任务就是找边界条件了,我觉得边界也是非常重 ...
- POJ1664(整数划分)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30894 Accepted: 19504 Description ...
- poj1664 放苹果(DPorDFS)&&系列突破(整数划分)
poj1664放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33661 Accepted: 20824 Desc ...
- HOJ 1402 整数划分
HOJ1402 整数划分 http://acm.hit.edu.cn/hoj/problem/view?id=1402 [题目描述] 整数划分是一个经典的问题.希望这道题会对你的组合数学的解题能力有所 ...
- nyoj_90_整数划分_201403161553
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正整数 ...
- 51nod p1201 整数划分
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...
随机推荐
- 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所 ...
- python密码处理(可用于生产模式)
import os from hashlib import sha256 from hmac import HMAC def encrypt_password(password, salt=None) ...
- angularjs学习笔记三——directive
AngularJS 通过被称为 指令 的新属性来扩展 HTML. 正如你所看到的,AngularJS 指令是以 ng 作为前缀的 HTML 属性. HTML5 允许扩展的(自制的)属性,以 data- ...
- javascript 字符串滚动显示
<html> <head> <script type="text/javascript"> var chars = "JavaScri ...
- indexof()方法
w3c手册定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 stringObject.indexOf(searchvalue,fromindex) searchva ...
- js 刷新页面大全
一.先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做. frame.html 由上(top.html)下(bottom ...
- 平稳退化,JS和HTML标记分离,极致性能的JavaScript图片库
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- TCP客户/服务器程序概述
一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程 ...
- IPv6套接字地址结构
IPv6套接字地址结构 struct in6_addr{ unit8_t sa_addr[16]; }; #define SIN6_LEN struct sockaddr_in6{ unit8_t s ...
- 搬瓦工搭建VPN
搬瓦工VPS的PPTP VPN搭建其实和上面都是很简单的,这个要用到上面的搬瓦工VPS控制面板. Root shell - advanced 下载 centos 6 一键安装包 wget --no-c ...