ZOJ 1163 The Staircases(01背包)

时间:2014-04-02 19:52:55   收藏:0   阅读:538

题意:求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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!