#include<bits/stdc++.h>
using namespace std;
const int N =1010;
const int mod=1000000007;
int f[N][N];
int main()
{
int n;
cin>>n;
f[1][1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;
}
}
int res=0;
for(int i=1;i<=n;i++) res=(res+f[n][i])%mod;
cout<<res<<endl;
return 0;
}
计数类dp:f数组的含义是,总和是i,用j个数字来组成这个总和,首先初始化,初始化的意思是,总和是1,用一个数,有一种情况,1,然后是状态计算
状态计算:分成两种情况,分类标准是j个数字里面有没有数字1,如果有数字1,把总和减去1,数字个数减去1,数组的数值是没有发生变化的
另外一种情况是j个数字里面没有数字1,每一个数字都严格大于1,那么把每一个数字都减小1,数字个数不变,总和就减小了j,数组的数值也没有发生改变
最后把f[n][i]求和就是答案
所以就是,定义数组,初始化数组,状态计算