2011-12-16 07:52:18

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

 题意:有1、5、10、25、50一共五种硬币,问取不超过100枚组成n的种类有多少。

mark:一开始没看到不超过100枚的条件。这题母函数不好做,直接dp吧。

dp[i][j][k]表示用前i种硬币j枚组成面额k的种类数,转移方程是dp[i][j][k] = dp[i-1][j][k] + dp[i][j-1][k-tab[i]]。

数据小,各种暴力吧。

代码:

# include <stdio.h>


int dp[5][110][300] ;
int ans[300] ;
int tab[5] = {1, 5, 10, 25, 50} ;


int init()
{
int i, j, k ;
for (i = 0 ; i <= 100 ; i++)
dp[0][i][i] = 1 ;
for (i = 1 ; i < 5 ;i++)
{
for (j = 0 ; j <= 100 ; j++)
for(k = 0 ; k <= 250 ; k++)
dp[i][j][k] = dp[i-1][j][k] ;
for (j = 1 ; j <= 100 ; j++)
for (k = tab[i] ; k <= 250 ; k++)
dp[i][j][k] += dp[i][j-1][k-tab[i]] ;
}
for (i = 0 ; i <= 250 ; i++)
{
ans[i] = 0 ;
for (j = 0 ; j <= 100 ; j++)
ans[i] += dp[4][j][i] ;
}
}


int main ()
{
int n ;
init() ;
while (~scanf ("%d", &n))
{
printf ("%d\n", ans[n]) ;
}
}