[恢]hdu 2189

2011-12-23 08:29:57

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2189

题意:中文。把n拆成素数和有几种拆法。

mark:本是标准母函数,不过用dp也可以YY一下。

dp[i][j]表示用最大不超过i的素数组成j有多少种方法。

如果i不是素数,直接和i-1的情况相同,

如果i是素数,有

dp[i][j] = dp[i][j-i] + dp[i-1][j]

代码:

# include <stdio.h>
# include <string.h>


int dp[200][200] ;
int n ;
int IsPrime[200] = {1, 1} ;

void init ()
{
int i, j ;
for (i = 2 ; i<= 150 ; i++)
{
if (IsPrime[i] == 1) continue ;
for (j = i*2 ; j <= 150 ; j+=i)
IsPrime[j] = 1 ;
}
}


int gao()
{
int i, j, ans ;
memset (dp, 0, sizeof(dp)) ;
dp[1][0] = 1 ;
for (i = 2 ; i <= n ; i++)
{
for (j = 0 ; j <= n ; j++)
dp[i][j] = dp[i-1][j] ;

if (IsPrime[i]) continue ;

for (j = i ; j <= n ; j++)
dp[i][j]+= dp[i][j-i] ;

ans = dp[i][n] ;
}
return ans ;
}


int main ()
{
int T ;
init() ;
scanf ("%d", &T) ;
while (T--)
{
scanf ("%d", &n) ;
printf ("%d\n", gao()) ;
}
return 0 ;
}



posted @ 2012-01-06 23:30  Seraph2012  阅读(188)  评论(0编辑  收藏  举报