整数划分
解法1:转化为完全背包
int dp(){
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
f[i][j]=f[i-1][j];
if(j>=i){
f[i][j]=(f[i][j]+f[i][j-i])%mod;
}
}
}
return f[n][n];
}
int dp(){
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
f[j]=(f[j]+f[j-i])%mod;
}
}
return f[n];
}
解法2:计数DP
//f[i][j] 总和是i 由j个数组成的方案数
int solve(){
f[0][0]=1;
for(int i=1;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;
}
return res;
}