Hdu-2069_Coin Change

本文探讨了一道经典的计算机科学问题——硬币找零问题。通过动态规划的方法解决如何使用五种不同面值的硬币(1分、5分、10分、25分、50分)组合成特定金额的方案数量,并限制每种方案中硬币总数不超过100个。

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

Hdu-2069_Coin Change 

题意:有若干5种面值的硬币,分别是1分,5分,10分,20分,50分。求现在表示钱数n(n<250),有多少种方案?

乍一看是母函数的题,但是后面说,每一种方案 硬币数目不超过100;

我们可以看出,该题就是指定因子的整数划分

用动态规划,dp[j][k]=dp[j][k] + dp[j-1][k-b[i]];

注意:测试用例有n=0的情况正确的结果应该输出1。这里wa了!汗

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define M 252

int money[5]={1,5,10,25,50};
int dp[102][M];
void solve()
{
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;//注意初始化
    int i,j,k;
    for(i=0;i<5;i++)
    for(j=1;j<=100;j++)//硬币个数
    {
        for(k=money[i];k<M;k++)//k是组合得到的money 数
        dp[j][k]=dp[j][k] + dp[j-1][k-money[i]];
    }
}
int main()
{
    solve();
    int n,j,ans;
    while(cin>>n)
    {
       if(n==0){printf("1\n");continue;}
       ans=0;
       for(j=1;j<=n&&j<=100;j++)
            ans+=dp[j][n];
       cout<<ans<<endl;
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值