NYOJ 90 —— 求正整数n划分为若干个正整数的划分个数
整数划分
-
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
- 输入
- 第一行是测试数据的数目M(1<=M<=10)。以下每行均包含一个整数n(1<=n<=10)。
- 输出
- 输出每组测试数据有多少种分法。
- 样例输入
-
1 6
- 样例输出
-
11 下面转自博客:http://www.cnblogs.com/hoodlum1980/archive/2008/10/11/1308493.html
所谓整数划分,是指把一个正整数n写成如下形式:
n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则:{m1,m2,...,mi}为n的一个划分。
如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)≤m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);
例如:当n=4时,共有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};
注意4=1+3 和 4=3+1被认为是同一个划分。
该问题是求出n的所有划分个数,即f(n, n)。
通用的递推公式如下:
f(n, m) = 1; ( n = 1 or m = 1 )
f(n, n); ( n < m )
1+ f(n, m - 1); ( n = m )
f(n - m, m) + f(n, m - 1); ( n > m )
1)自顶向下实现的版本:
#include <cstdio> #include <iostream>using namespace std;int f(int i, int j) {if(i==1 || j==1) return 1;if(i<j) return f(i, i);if(i==j) return f(i, i-1) + 1;return f(i, j-1) + f(i-j, j); }int main () {int T, n;scanf("%d", &T);while(T--) {scanf("%d", &n);printf("%d\n", f(n, n)); }return 0; }
2)自底向上实现的版本:
#include <cstdio> #include <iostream>using namespace std;const int MAXN = 15;int dp[MAXN][MAXN];void init() {for(int i=1; i<MAXN; i++) {for(int j=1; j<MAXN; j++) {if(j>i) dp[i][j] = dp[i][i];else if(j == i) dp[i][j] = dp[i][j-1] + 1;else dp[i][j] = dp[i][j-1] + dp[i-j][j];}} }int main () {init();int T, n;scanf("%d", &T);while(T--) {scanf("%d", &n);printf("%d\n", dp[n][n]);}return 0; }
转载于:https://www.cnblogs.com/AcIsFun/p/5346053.html
NYOJ 90 —— 求正整数n划分为若干个正整数的划分个数相关推荐
- N划分成若干个奇正整数之和的分法有多少种---动态规划
本文只是对: OJ 7219 复杂的整数划分各变形题总结__动态规划(别人写的) 里的把N划分成若干个奇正整数之和的分法有多少种的个人理解(在最下方). 1.截个图做笔记先 #include < ...
- 枚举求解:试把一个正整数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,求出所有符合这种拆分要求的连续正整 ...
- 正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大
题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3 4=1+3,5=1+4=2+3,6=1+5=2+4. 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然 ...
- 编程序求出满足如下条件的四位正整数个数:个位数字与百位数字的和是十位数字与千位数字之和的两倍。
编程序求出满足如下条件的四位正整数个数:个位数字与百位数字的和是十位数字与千位数字之和的两倍. 代码如下: #include<stdio.h>int main() {int n;int a ...
- 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个?...
2014下半年网络工程师 上午试卷 综合考试 公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个? A.100 B.64 C.128 D.500 解析:因为需要1000 ...
- 计算机网络课程设计子网划分,计算机网络实验三 子网掩码与划分子网
实验三子网掩码与划分子网 一.实验目的 (1)掌握子网掩码的算法 (2)掌握用子网掩码划分子网以及动手搭建子网的方法 (3)熟悉模拟软件Packet Tracert5.3的使用 二.实验仪器设备及软件 ...
- vlan划分_什么样的网络需要划分VLAN?
一.VLAN的定义 VLAN是英文Virtual Local Area Network的简称,又叫虚拟局域网,是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的新兴技术. ...
- 简述子网划分的方法 计算机网络,IP子网划分
IP子网划分实际上就是设计子网掩码的过程.由于在五类的IP地址中,网络号与主机号的的位数并不一致,就造成了要么是网络号太多,要么是主机号太多.为了解决这些问题,就需要划分子网.将一个网络划分为子网:采 ...
- HDU4135 HDU2841 HDU1695 求[1,m]中与n互素的数的个数
求n的质因子 模板:求1-m之间与n互素的数的个数 vector<ll>p; //返回1-m中与n互素的数的个数 ll cal(ll n,ll m) {p.clear();for(int ...
最新文章
- 如果看懂git -help
- Synchronize对String加锁解决
- JavaFX真实世界应用程序:EIZO CuratOR Caliop
- python3 面向对象_Python3 面向对象
- java 素数乘积,求助2424379123 = 两个素数的乘积,求这两个素数?
- 第四篇:稳定性之提升团队潜意识【及时止损、监控报警】
- 2021年河北高考生成绩排名查询,2021年河北省高考报名人数、录取分数线、河北省最好大学排名统计[图]...
- 微信公众号--H5商城在线客服的解决方案:使用微信公众号的对话能力插件实现在线客服沟通
- 计算机操作系统|汤小丹|第四版|习题答案(一)
- java打印特殊符号_Java Poi 在Excel中输出特殊符号的实现方法
- smali 添加资源
- (XWZ)的python学习笔记Ⅵ——进程和线程
- java调用百度地图api,展示世界地图
- 洛谷1156 垃圾陷阱
- 如何 gitignore .gitignore
- 毒液蛋白质相互作用分析
- jquery传输文件到后端,后端处理数据。
- ChatGPT怎么突然变得这么强?华人博士万字长文深度拆解GPT-3.5能力起源
- SR-ITM--融合超分辨率和逆色调映射(二)
- java滚动条_java swing:文本框添加滚动条
热门文章
- Pytorch 类型错误:Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor.
- java jlist 更新_java – 更新JList
- html中有csstext方法吗,style对象的cssText方法有哪些使用方法
- linux下的qt缺少iostream,c – iostream:没有这样的文件或目录
- java升序问题_JAVA并发理解之重排序问题
- android studio 库项目,Android Studio 发布项目到jcenter库
- MySQL面试题 | 附答案解析(二)
- C++:将char*指针强制转换成一个指向结构体的指针
- Jupyter-ROS(机器人操作系统)
- GPU运行Tensorflow详细教程及错误解决