题目
描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
分析
本题和[笔记][中国大学mooc][程序设计与算法(二) 算法基础][递归] 放苹果题目类似,实际上本题的解空间是这道题的解空间的子集,有
f
u
n
c
t
i
o
n
(
n
)
=
f
u
n
c
t
i
o
n
′
(
n
,
n
)
function(n)=function'(n,n)
function(n)=function′(n,n)
代码
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int function(int m, int n){
if(n>m) return function(m,m);
else if(m==1||n==1 || m==0) return 1;
else return function(m-n,n)+function(m,n-1);
}
int main(){
int m;
while(!(cin >> m).eof()){
cout << function(m,m)<<'\n';
}
return 0;
}
其他
注意while(!(cin >> m).eof())
是在文件末尾结束循环的方法