f[i,j]表示最后一个阶梯的高度不超过i,使用j个bricks的方案,那么转移方程就是f[i,j]=f[i-1,j]+f[i-1,j-i]; (j-i是因为,将i个bricks用来修最后一个阶梯,所以还剩j-i个bricks) . #include <iostream> #include <cstdio> #include <cstring> using namespace std; long long f[501][501],n; int main(void) { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;++i) f[0][i]=0; f[0][0]=1; for(int i=1;i<n;++i) { for(int j=n;j>=i;j--) f[i][j]=f[i-1][j]+f[i-1][j-i]; for(int j=0;j<i;++j) f[i][j]=f[i-1][j]; } printf("%lld/n",f[n-1][n]); } return 0; }