题目描述
一个正整数可以划分为多个正整数的和,比如n=3时:
3;1+2;1+1+1;
共有三种划分方法。
给出一个正整数,问有多少种划分方法。
数据规模和约定
n< =100
输入
一个正整数n
输出
一个正整数,表示划分方案数
样例输入
3
样例输出
3
提示
C语言在线学习平台微信号dotcpp
来源
算法提高
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int dp[N][N];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) dp[i][0]=0;
for(int i=0;i<=n;i++) dp[0][i]=1;
//dp[i][j]表示把i拆分成不超过j的方案数
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
//dp[i][j]只有包含j和不包含j两种情况
//dp[i][j-1]不包含j,dp[i-j][j]包含若干个j
if(i>=j) dp[i][j]=dp[i][j-1]+dp[i-j][j];
else dp[i][j]=dp[i][i];
}
}
printf("%d",dp[n][n]);
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
long long res,n;
void dfs(int pre,int sum)
{
if(sum==n)
{
res++;
return ;
}
if(sum>n) return ;
for(int i=pre;i+sum<=n;i++)
{
dfs(i,sum+i);
}
}
int main(void)
{
/*
freopen("D:\\outputdemo","w",stdout);
for(int i=1;i<=100;i++)
{
n=i;
res=0;
dfs(1,0);
printf("a[%d]=%d;\n",i,res);
}
*/
int n,a[110];
cin>>n;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=5;
a[5]=7;
a[6]=11;
a[7]=15;
a[8]=22;
a[9]=30;
a[10]=42;
a[11]=56;
a[12]=77;
a[13]=101;
a[14]=135;
a[15]=176;
a[16]=231;
a[17]=297;
a[18]=385;
a[19]=490;
a[20]=627;
a[21]=792;
a[22]=1002;
a[23]=1255;
a[24]=1575;
a[25]=1958;
a[26]=2436;
a[27]=3010;
a[28]=3718;
a[29]=4565;
a[30]=5604;
a[31]=6842;
a[32]=8349;
a[33]=10143;
a[34]=12310;
a[35]=14883;
a[36]=17977;
a[37]=21637;
a[38]=26015;
a[39]=31185;
a[40]=37338;
a[41]=44583;
a[42]=53174;
a[43]=63261;
a[44]=75175;
a[45]=89134;
a[46]=105558;
a[47]=124754;
a[48]=147273;
a[49]=173525;
a[50]=204226;
a[51]=239943;
a[52]=281589;
a[53]=329931;
a[54]=386155;
a[55]=451276;
a[56]=526823;
a[57]=614154;
a[58]=715220;
a[59]=831820;
a[60]=966467;
a[61]=1121505;
a[62]=1300156;
a[63]=1505499;
a[64]=1741630;
a[65]=2012558;
a[66]=2323520;
a[67]=2679689;
a[68]=3087735;
a[69]=3554345;
a[70]=4087968;
a[71]=4697205;
a[72]=5392783;
a[73]=6185689;
a[74]=7089500;
a[75]=8118264;
a[76]=9289091;
a[77]=10619863;
a[78]=12132164;
a[79]=13848650;
a[80]=15796476;
a[81]=18004327;
a[82]=20506255;
a[83]=23338469;
a[84]=26543660;
a[85]=30167357;
a[86]=34262962;
a[87]=38887673;
a[88]=44108109;
a[89]=49995925;
a[90]=56634173;
a[91]=64112359;
a[92]=72533807;
a[93]=82010177;
a[94]=92669720;
a[95]=104651419;
a[96]=118114304;
a[97]=133230930;
a[98]=150198136;
a[99]=169229875;
a[100]=190569292;
cout<<a[n];
return 0;
}