题目描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
dp没学明白,用的搜索写的
提供一些数据
n=50 输出204226
n=44 输出 75175
n=49 输出173525
代码如下:
//有些oj要求读入数据使用eof,可以自行添加
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n;
int cnt=0;
void s(int i,int t)//因为要保证后一个数大于等于前一个数,所以用i来记录前一个数 ,t用来记录当前的和
{
if(t==n)//如果达到了要求值,那么这就算一种加的方法
{
cnt++;
return ;
}
for(int j=1;j<=50;j++)
{
if(j>=i&&j+t<=n)//题目要求后一个大于前一个,且和要小于等于n才能进入下一层搜索
{
t=t+j;
s(j,t);
t=t-j;
}
}
}
int main()
{
scanf("%d",&n);
s(1,0);//由于nk最小是从1开始,这里的i设置为1.
printf("%d\n",cnt);//输出方案数量
return 0;
}