参考博客:链接
题面:链接
题目大意:将一个正整数n,分解为若干个正整数之和,求分解方法的数目。
思路:由于n较小,且分解的方法数目一定,可以选择先打表,后直接出处即可。
打表过程先看题目给出的例子:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
由题目中的例子知:
可设dp(a,k)表示将一个数a用不大于k的数划分的方法(1<=k<=n);
就从k开始,先分掉一个k,分解方法为:dp(a-k, k);
紧接着,可以从k’=k-1开始,分解方法为: dp(a,k-1);
a-k=0时结果为1,a小于k时,dp(a,k)为dp(a,a);
则递推式即:dp(a,k)=dp(a-k,k)+dp(a,k-1);
注意:初始状态 a=1、k=1时,分解结果唯一,当
a<k,结果也是唯一的,都为1。
ac代码:
#include<stdio.h>
#define ll long long//分解方法数目小,不会超
int dp[121][121];
void Play_table()//打表,记录数字n的拆分方法
{
int i,j;
for(i=1; i<=120; i++)
{
dp[1][i]=dp[i][1]=dp[0][i]=1;
}
for(i=2; i<=120; i++)
{
for(j=2; j<=120; j++)
{
dp[i][j]=i>=j?
dp[i-j][j]+dp[i][j-1]:dp[i][i];//!!
}
}
}
int main()
{
int n;
Play_table();
while(~scanf("%d",&n))
{
if(n<1||n>120) break;
printf("%d\n",dp[n][n]);
}
return 0;
}