IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法-最少硬币问题 -> 正文阅读

[数据结构与算法]数据结构与算法-最少硬币问题

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

  • 数据输入:由文件input.txt 提供输入数据,文件的第一行中只有1 个整数给出n 的值,第2 行起每行2 个数,分别是T[j] 和Coins[j] 。最后1 行是要找的钱数m。

  • 数据输出:程序运行结束时,将计算出的最少硬币数输出到文件output.txt 中。问题无解时输出-1。

  • 样例输入:
    3

    1 3

    2 3

    5 3

    18

  • 样例输出: 5

  • 代码

    /**
    * 请不要质疑1+1=2
     */
    #include <iostream>
    #include <iomanip>
    #include <algorithm>  //sort
    #include <map>
    #include <queue>
    #include <deque>  //双端队列,头可插,尾可插
    #include <string>
    #include <cstring>
    #include <stack>
    #include <cmath>
    #include <fstream>
    #include <ctime>
    #include <climits> //数值的限制范围
    //(double)clock() / CLOCKS_PER_SEC <= 0.95 限制0.95s跑完
    using namespace std;
    
    class Solver {
        //通用属性
    public:
        string name;
        bool isDebug;
    
        Solver(const string name, const bool isDebug) {
            this->name = name;
            this->isDebug = isDebug;
        }
    
        //通用方法
    protected:
        static int QuickRead() {
            int num = 0, flag = 1;
            char ch = getchar();
            //读符号
            while (ch < '0' || ch > '9') {
                if (ch == '-') {
                    flag = -1;
                }
                ch = getchar();
            }
            //读数值
            while (ch >= '0' && ch <= '9') {
                num = (num << 1) + (num << 3) + (ch ^ 48);
                ch = getchar();
            }
            return flag * num;
        }
    
    public:
        void SaveCpp() const {
    
            fstream input;
            fstream output;
    
            input.open("moota.cpp", ios::in);
            const string file = name + ".cpp";
            output.open(file.c_str(), ios::out);
    
            char c = 'O';
            while (!input.eof()) {
                input.get(c);
                output << c;
            }
    
            input.close();
            output.close();
    
        }
    
        void Debug(const string message) const {
            if (isDebug) { cout << message; }
        }
    
    protected:
        //待实现方法
        virtual void BeginPlay() {
            Debug("\n---BeginPlay---\n");
        };
    
        virtual void Playing() {
            Debug("\n---Playing---\n");
        };
    
        virtual void EndPlay() {
            Debug("\n---EndPlay---\n");
        };
    public:
        //外观模式
        void Play() {
            BeginPlay();
            Playing();
            EndPlay();
        }
    };
    
    class Player {
    private:
        string name;
    public:
        Player(const string name) {
            this->name = name;
        }
    
        void Play(Solver* solver) const {
            if (solver->isDebug) {
                cout << "\n" << name << "开始做题\n";
                solver->SaveCpp();
            }
            solver->Play();
        }
    };
    
    class SpecialSolver : public Solver {
    public:
        static const int MAX = int(1e7);
        static const long long INF = (long long)1e18;
    
        SpecialSolver(const string name, const bool isDebug): Solver(name, isDebug) {
        }
    
    private: //实例属性
        int n, m;
    
        struct Node {
            int value;
            int num;
        } node[20];
    
        int dp[1000];
    private: //实例方法
        void Dp() {
            for (int i = 1; i <= m; ++i) {
                dp[i] = MAX;
            }
            //i:硬币编号
            for (int i = 1; i <= n; ++i) {
                int num = node[i].num;
                //j:使用硬币数
                for (int j = 1; j <= num; ++j) {
                    //k:当前总价值
                    for (int k = m; k >= node[i].value * j; --k) {
                        dp[k] = min(dp[k], dp[k - node[i].value * j] + j);
                    }
                }
            }
        }
    
    protected
    :
        virtual void BeginPlay() override {
            Solver::BeginPlay();
            cin >> n;
            for (int i = 1; i <= n; ++i) {
                cin >> node[i].value >> node[i].num;
            }
            cin >> m;
        };
    
        virtual void Playing() override {
            Solver::Playing();
            Dp();
        };
    
        virtual void EndPlay() override {
            Solver::EndPlay();
            if (dp[m] != MAX) {
                cout << dp[m];
            }
            else {
                cout << "-1";
            }
    
        };
    };
    
    //注意改名字和状态
    Player player("moota");
    SpecialSolver specialSolver("最少硬币问题", false);
    
    int main() {
        player.Play(&specialSolver);
    }
    
    
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:22:35  更:2021-11-25 08:24:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 16:02:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码