
解法一(看成完全背包问题)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>void solve() {int n;cin>>n;int dp[n+3];dp[0]=1;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){dp[j]=dp[j]+dp[j-i];}}cout<<dp[n];
}signed main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int lll=1;
// cin>>lll;while(lll--){solve();if(lll) cout<<'\n';}return 0;
}
解法二
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>void solve() {int n;cin>>n;int g[n+3][n+3]={0};memset(g,0,sizeof(g));
// g[i][j] 表示将整数i拆分成j个正整数之和的方案数。
// 例如g[4][2] = 2(4=1+3、4=2+2,共2种拆成2个数的方案)g[0][0]=1;for(int i=1;i<=n;++i){for(int j=1;j<=i;j++){g[i][j]=g[i-1][j-1]+g[i-j][j];}}int ans=0;for(int i=1;i<=n;i++){ans+=g[n][i];}cout<<ans;
}signed main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int lll=1;
// cin>>lll;while(lll--){solve();if(lll) cout<<'\n';}return 0;
}