假设有5种类型的硬币50美分,25美分,10美分,5美分和1我们美分想用这些硬币进行一定数量的更改例如,如果我们有11美分,那么我们可以用一个10美分的硬币和一个1美分的硬币,或者两个5美分的硬币和一个1美分的硬币,或者一个5美分的硬币和6个1分的硬币进行更改,分币,或11个1分硬币。所以有四种方法可以用上述硬币进行11美分的更改。请注意,我们认为有一种方法可以使零分变化。编写一个程序来查找以美分为单位的任何金额变化的不同方式的总数。你的程序应该能够处理多达100个硬币。
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2069
在母函数的基础上改造的DP
# 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]) ;
}
}