题意:求N块砖头能搭成多少种不同的楼梯,要求楼梯每一阶所组成的砖头数都不一样.
思路:相当于求用i个数组成N能有多少种方法.
dp[i][j]为前i个数组成j的方案数.
dp[i][j] = sum(dp[i - 1][j - i]).意思是前i - 1个数组成j - i的方案数.
可以用滚动数组优化,本质上其实就是一个01背包,容量为j,重量为i
注意用long long;
#include <cstdio>
#include <memory.h>
using namespace std;
const int MAX = 501;
long long dp[MAX];
int main(int argc, char const *argv[]){
int N;
dp[0] = 1;
for(int i = 1; i < MAX; ++i){
for(int j = MAX - 1; j >= i; --j){
dp[j] += dp[j - i];
}
}
while(scanf("%d", &N) == 1 && N){
printf("%lld\n", dp[N] - 1);
}
return 0;
}