解题报告:如果用dfs做 就tle,其实我也没多大思路,就算想出来了状态转移,还是写不好状态初始,哎。。。我这里的dp[i][j]代表总和为i,j为分组。以最小值是不是1来分组,如果是1,减去这一组,如果最小值大于等于2,那么每一组都减去1就ok了

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#define IL inline
#define x first
#define y second
typedef long long ll;
using namespace std;
const	int N=110;
int dp[N][N];
int main()
{
	int	n;
	cin>>n;
	 dp[0][0]=1;
	 for(int i=1;i<=n;i++)
	 dp[i][1]=1;
	 for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 if(j<=i)	dp[i][j]=dp[i-1][j-1]+dp[i-j][j];// 按照最小值是不是1来分类 
	 ll res=0;
	 for(int i=1;i<=n;i++)
	 res+=dp[n][i];
	 cout<<res<<endl;
	 
	 
	 
    return 0;
}