这道题就是整数的划分,其实定义好了状态,就是简单的动态规划的递推。
我们定义dp[n][k]表示将n进行划分,最大的数不超过k的方案有多少种,那么我们可以得到如下的递推方案:
dp[n][k] = dp[n][k-1] + dp[n-k][k];
其中的dp[n][k-1]便是将n进行进行整数的划分,最大的数不超过k-1的方案数;dp[n-k][k]表示拿出一个k后,剩下的数被不超过k的数的表示的方案数。
其中当k>n的时候,则和dp[n][n]的值相同,下面通过递推的方式求出所有的解,然后对应的输入n,输出dp[n][n]就行了。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int MAX = 122;
int dp[MAX][MAX];
void Dynamic()
{
for(int i=1; i<MAX; i++)
{
dp[i][1] = dp[1][i] = dp[0][i] = 1;
}
for(int i=2; i<MAX; i++)
{
for(int j=2; j<MAX; j++)
{
if(j<=i)
dp[i][j] = dp[i][j-1] + dp[i-j][j];
else
dp[i][j] = dp[i][i];
}
}
}
int main()
{
int n;
Dynamic();
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[n][n]);
}
return 0;
}