HDU 2069 DP 写法

本文介绍了一种基于动态规划的硬币找零算法,该算法用于计算特定金额下使用不同面额硬币找零的所有可能组合数。通过一个具体实例展示了如何编写程序实现这一算法,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设有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]) ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值