类型:递推
题目:http://acm.timus.ru/problem.aspx?space=1&num=1017
思路:用f(i, j)表示,用j块砖组成i个梯级能组成的方案数
考虑最下面一层为i块砖,如果去掉这一层,会有两种情况f(i, j - i)和f(i - 1, j - i)
故有f(i, j) = f(i, j - i) + f(i - 1, j - i)
初始化:f(1, j) = 1; f(i, j) = 0 [j < i * (i + 1) / 2]!!!数据用long long
// ural 1017
// wa wa wa ac 0.015s
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(i = (a); i > (b); --i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define CLR(a,b) memset(a,b,sizeof(a))
const int MAXN = 510;
const int INF = 0x7f7f7f7f;
long long dp[MAXN][MAXN];
int main() {
int i, j, n;
while(cin>>n) {
CLR(dp, 0);
for(i = 1; i <= n; ++i)
dp[1][i] = 1;
for(i = 2; i * (i + 1) / 2 <= n; ++i)
for(j = i * (i + 1) / 2; j <= n; ++j)
dp[i][j] = dp[i][j - i] + dp[i - 1][j - i];
//!!!
long long sum = 0;
for(i = 2; i * (i + 1) / 2 <= n; ++i)
sum += dp[i][n];
cout<<sum<<endl;
}
return 0;
}