题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=651
题目大意: 给你一个长度为L的棍让你截成k(k>=2)段,并且截下的每小段的长度都不能相等, 问你总共有多少种请况
根据题意我们可知这是一道整数划分的题, 首先我要找到能最多分为多少段 1+2+3........+k = k(k+1)/2; 所以k最多为315
定义状态 dp(i, j) 为整数i分为j段总共有多少种。
情况分为两种:
1、只有一个1的,则等于dp[i-j][j-1],相当与从i里拿走j个1,可以分成j-1段的方案数
2、没有1的,则等于dp[i-j][j],相当于从i里拿走j个1,可以分成j段的方案数
所以 dp[i][j]=dp[i-j][j-1]+dp[i-j][j]
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 50000 + 10;
const int M = 320;
const int MOD = 1000000;
int dp[N][M];
void inin()
{
memset(dp, 0, sizeof(dp));
for(int i = 3; i < N; i++)//初始化分为两段的
dp[i][2] = (i-1)/2;
for(int i = 4; i < N; i++)
for(int j = 3; j < M; j++)
if(i > j)
dp[i][j] = (dp[i-j][j] + dp[i-j][j-1])%MOD;
}
int main()
{
int T, n, ans;
inin();
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
ans = 0;
for(int i = 2; i < M; i++)
ans =(ans + dp[n][i])%MOD;
printf("%d\n", ans);
}
return 0;
}