不算太难的DP,开始我直接用暴搜做的。。果断TLE了。。结果挺大的,要用long long存,DP的话,用dp[i][j]表示总和为i,最高木块<=j的方案总数,然后dp[i][j+1]状态转移就是dp[i][j]加上最高木块高度刚好为j+1的方案总数
#include<stdio.h>
#include<string.h>
int main()
{
long long dp[501][501];
memset(dp, 0, sizeof(dp));
int i, j;
for (i = 1; i <= 500; i++)
dp[1][i] = 1LL;
for (i = 2; i <= 500; i++)
dp[2][i] = 1LL;
for (i = 3; i <= 500; i++)
{
for (j = 2; j <= i - 1; j++)
dp[i][j] = dp[i][j - 1] + dp[i - j][j - 1];
dp[i][j] += 1;
for (; j <= 500; j++)
dp[i][j] += dp[i][j - 1];
}
while (scanf("%d", &i), i)
printf("%lld\n", dp[i][500] - 1);
return 0;
}