整数划分(三连发)(二)

2014-11-24 10:23:20 · 作者: · 浏览: 1

/*第四个问题(不大懂)*/
long long tmpDP[MAXN][MAXN];
memset(dp , 0 , sizeof(dp));
memset(tmpDP , 0 , sizeof(tmpDP));
dp[0][0] = tmpDP[0][0] = 1;
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= i ; j++){
tmpDP[i][j] = dp[i-j][j];
dp[i][j] = dp[i-1][j-1] + tmpDP[i-j][j];
}
}
for(ans = 0 , i = 1 ; i <= n ; i++)
ans += dp[n][i];
printf("%lld\n" , ans);

/*第五个问题dp[i][j]表示前i个物品中组成为j的方案数*/
memset(dp , 0 , sizeof(dp));
for(i = 1 ; i <= n ; i++)
dp[i][0] = dp[i][1] = 1;/*赋值初始化*/
for(i = 1 ; i <= n ; i++){
for(j = n ; j >= 2 ; j--){
if(j >= i) /*j >= i*/
dp[i][j] = dp[i-1][j] + dp[i-1][j-i];
else
dp[i][j] = dp[i-1][j]; /*j < i*/
}
}
printf("%lld\n\n" , dp[n][n]);/*输出答案*/
}

int main(){
while(scanf("%d%d" , &n , &k) != EOF)
solve();
return 0;
}