首页 > 其他 > 详细

ZOJ 1163 The Staircases(01背包)

时间:2014-04-02 19:52:55      阅读:536      评论:0      收藏:0      [点我收藏+]

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

ZOJ 1163 The Staircases(01背包)

原文:http://blog.csdn.net/zxjcarrot/article/details/22810719

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!