zoj1163

来源:互联网 发布:java中权限控制框架 编辑:程序博客网 时间:2024/06/06 16:25

题目大意:

求N块砖头能搭成多少种不同的楼梯,要求楼梯每一阶所组成的砖头数都不一样.

解题思路:

相当于求用i个数组成N能有多少种方法.
dp[i][j]为前i个数组成j的方案数.
dp[i][j] = sum(dp[i - 1][j - i]).意思是前i - 1个数组成j - i的方案数.
可以用滚动数组优化,本质上其实就是一个01背包,容量为j,重量为i

代码如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){  double dp[510][510];  int n,i,j,k;  memset(dp,0,sizeof(dp));  for(i=0;i<=500;i++)  {    for(j=0;j<=500;j++)    {      if(i==0)      {        dp[i][j]=1;        continue;      }      if(j==0)      {        dp[i][j]=0;        continue;      }      if(i>=j)      {        dp[i][j]=dp[i][j-1]+dp[i-j][j-1];      }      else      {        dp[i][j]=dp[i][j-1];      }    }  }  while(scanf("%d",&n)!=EOF&&n)  {     printf("%.0lf\n",dp[n][n]-1);   }  return 0;}
0 0
原创粉丝点击