题目大意:
给你一个数n,定义:把n表示成若干个数的和的形式焦作n的一种划分。问你这个n一共有多少种划分方法。(1<=n<=120)
分析:
dp建立:
状态:
dp [ i ] [ j ] 表示对 i 的划分方式中最小的数是 j 的划分方式数。
转移方程:
边界条件:
代码:
#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;
}
}