题目大意:

给你一个数n,定义:把n表示成若干个数的和的形式焦作n的一种划分。问你这个n一共有多少种划分方法。(1<=n<=120)

分析:

dp建立:

状态:

dp [ i ] [ j ] 表示对 i 的划分方式中最小的数是 j 的划分方式数。

转移方程:

dp[i][j]=dp[ij][j]+dp[ij][j+1]+....+dp[ij][ij]

边界条件:

dp[t][t]=11<=t<=n

代码:

#include<iostream>
using namespace std;
int a[200]={0};
int dp[200][200]={0};

void init()
{
    for(int i=1;i<=120;i++)
    {
        for(int j=1;j<i;j++)
        {
            for(int k=0;k<=i-2*j;k++)
            {
                dp[i][j]=dp[i][j]+dp[i-j][j+k];
            }
        }
        dp[i][i]=1;
    }
}

int main()
{
    int n;
    init();
    while(cin>>n)
    {
        int s=0;
        for(int i=1;i<=n;i++)
        {
            s+=dp[n][i];
        }
        cout<<s<<endl;
    }
}