题目大意:
求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;
}