Uva - 674 - Coin Change

本文介绍了一个经典的动态规划问题——使用不同面值的硬币组成特定金额的方法数。通过递推公式实现了高效的算法,并给出了完整的C++代码实现。

题意:用5种面值的硬币组成S有几种方法。

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=615

——>>设d[i][j]为用前i种硬币组成j有几种方法,则

当j >= 第i种面值的硬币时,d[i][j] = d[i-1][j-c[i]] + d[i-1][j];

否则,只有一种选择,d[i][j] = d[i-1][j];

第一次没打表,就TLE了……打表AC!

#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 7489 + 10;
int d[6][maxn], c[] = {0, 50, 25, 10, 5, 1};

int main()
{
    int S, i, j;
    memset(d, 0, sizeof(d));
        d[0][0] = 1;
        for(i = 1; i <= 5; i++)
            for(j = 0; j < maxn; j++)
                if(j >= c[i]) d[i][j] = d[i][j-c[i]] + d[i-1][j];
                else d[i][j] = d[i-1][j];
    while(~scanf("%d", &S)) printf("%d\n", d[5][S]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值