整数的划分
来源:互联网 发布:类似于百度云的软件 编辑:程序博客网 时间:2024/05/16 23:49
整数的划分
定义
所谓整数划分,是指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。
用数学语言定义如下:
一个正整数n可写成如下的形式:
其中
记
我们称之为n的m划分
例如5 = 5
5 = 4+1
5 = 3+2
5 = 2+2+1
5 = 3+1+1
5 =1+1+1+2
5 = 1+1+1+1+1
可见5的整数划分有7个(注意3+2和2+3算一种)
计算原理
很显然计算整数划分要用到递归思想
不妨这里记为f(n,m)
1.当 m = 1 或者 n = 1时
那么只有一种情况,那就是{1}或者{1,1,1,1,1…1}
2.当n
实例分析
我们以之前的n = 5,m = 5 举例
- .按照3,f(5,5) = 1+f(5,4)
- 按照4,f(5,4) = f(1,4) +f(5,3)
- 按照1,f(1,4) = 1
- 按照4,f(5,3) = f(2,3)+f(5,2)
- 按照3,4和1 f(2,3) = f(2,2) = 1+f(2,1) = 2
- 按照4和1 f(5,2) = f(3,2) +f(5,1) = f(1,2) +f(3,1) +f(5,1) = 3
- 最后将计算的结果回代,得到最终答案为3+2+1+1 = 7
C++代码
#include<iostream>using namespace std;int f(int n,int m); //求整数n的m划分 int main(void){ int n,m; cout << "请输入两个数字n和m,计算n的m划分:"; cin >> n >> m; cout << f(n,m); return 0; } int f(int n,int m){ if(n == 1 || m == 1) return 1; if(m>n) return f(n,n); else if(n == m) return 1+f(n,m-1); else return f(n-m,m) + f(n,m-1);}
反思
从上述例子,我们可以知道,光是5的情况,就递归了好多次,可想而知到数据足够大时,递归的效率就很低很低了。
阅读全文
0 0
- 整数划分的问题
- 整数的划分
- 整数的划分
- 整数的划分问题
- 整数的划分
- 整数的划分
- 整数的划分
- 整数的划分问题
- 整数的划分问题
- 整数的划分
- N的整数划分
- 简单的整数划分
- 复杂的整数划分
- 整数的划分数
- 整数的划分
- 【数论】整数的划分问题
- 打印整数的划分方法
- 【数论】整数的划分问题
- 习题 2.4(6) 将100~200之间的素数输出。
- CodeForces 835A Key races
- js函数
- HDU 6060 RXD and dividing
- LinkdeList(链式集合)
- 整数的划分
- JAVA日期格式转换与数据类型转换
- for循环的闭包
- 彻底理解call()及其apply.bind
- 莫比乌斯反演
- ArrayList底层实现
- 《Mining Large Streams of User Data for Personalized Recommendations》笔记
- Tip8 避免给枚举类型的元素提供显示的值
- 1.集合和数组的比较