题目大意:
求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;
}
本文介绍了一种使用动态规划解决砖块搭建不同楼梯的问题的方法。具体地,文章通过定义dp数组来表示用i个不同数量的砖块可以搭建出总数为j的不同楼梯的数量,并给出了完整的C语言实现代码。
224

被折叠的 条评论
为什么被折叠?



