Se puede transformar en un problema de mochila completo
Selecciona varios números del 1 al n para que su suma sea exactamente n ¿Cuántas soluciones hay en total?
dp[i][j] representa el número de soluciones seleccionadas de los i números anteriores para que su suma sea exactamente j
Considere cuántas veces se selecciona el i-ésimo número
dp[i][j]=dp[i-1][j]+dp[i-1][ji]+dp[i-1][j-2* yo]+ ...
Optimización del tiempo:
tenga en cuenta que dp[i][ji]=dp[i-1][ji]+dp[i-1][j-2*i]+dp[i-1][j-3*i] +....
entonces dp[i][j]=dp[i-1][j]+dp[i][ji]
Optimización del espacio:
matriz rodante
para i 1~n:
para ji~n: dp[j]=dp[j]+dp[ji]
Código:
int n;
cin>>n;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dp[j]=(dp[j]+dp[j-i])%mod;
}
}
cout<<dp[n];