解题报告:如果用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;
}