• 最少硬币问题


    Description

    设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
    对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。

    Input

    输入的第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1 行是要找的钱数m。

    Output

    输出计算的最少硬币数,问题无解时输出-1。

    Sample Input

    3
    1 3
    2 3
    5 3
    18
    

    Sample Output

    5
    

    Source

    南邮OJ-1221

    Hint

    使用dp[i]存储组成i元需要的最少硬币个数

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long int
    #define INF 0x3f3f3f3f
    int dp[20020];
    int main(){
        int i, j, k, n, m;
        cin >> n;
    
        int coins[n];  //硬币个数
        int T[n];      //硬币面值
    
        for(i = 0; i<n; i++)
            cin >> T[i] >> coins[i];
        cin >> m;
        for(i=1;i<=m;i++) dp[i]=INF;    //赋极大值,表示不可达
        for(i=0;i<n;i++)    //遍历硬币种类
            for(j=1;j<=coins[i];j++)    //遍历硬币数量
                for(k=m; k>=T[i]; k--)  //此处较难理解
                                        //只能是由m到T[i]而不能相反
                                        //试想,初始态dp[k-T[i]]应当=INF,dp[0]=0
                                        //如果能组成m元的硬币,那么应当存在一条0->m的路径,此时
                                        //dp[m]就是需要的硬币数量
                                        //否则,dp[m]将不能链接到dp[0],从而dp[m]=INF输出-1
                    dp[k] = min(dp[k], dp[k-T[i]]+1);
    
        cout << (dp[m]<m?dp[m]:-1) << endl;
        return 0;
    }
    
    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    jQuery中的事件与动画
    jQuery选择器
    Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
    Flask学习【第2篇】:Flask基础
    Flask学习【第1篇】:Flask介绍
    Python学习总目录
    Linux--安装Python3&虚拟环境
    Linux基础之vim
    Linux基础值Shell
    Linux文件系统结构
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/NOJ-1221.html
Copyright © 2020-2023  润新知