题意:求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; }
ZOJ 1163 The Staircases(01背包),布布扣,bubuko.com
原文:http://blog.csdn.net/zxjcarrot/article/details/22810719