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 ;
}