算法分析与设计实验:找零钱问题的贪心算法与动态规划解决方案

news2025/5/23 23:06:11

在计算机科学中,贪心算法和动态规划是两种常用的算法设计策略。本文将通过一个经典的找零钱问题,详细讲解这两种算法的实现和应用。我们将会提供完整的C++代码,并对代码进行详细解释,帮助读者更好地理解和掌握这两种算法。

问题描述

找零钱问题是这样一个问题:给定不同面值的零钱和一个总金额,如何使用最少数量的零钱来凑出这个总金额。例如,假设我们有面值为1、5、14、18的零钱,需要凑出28元,那么可能的解包括:28=18+5+5 或 28=14+14。

输入输出格式

输入:

  • 第一行:两个整数,分别表示零钱的种类数和需要凑的总金额。

  • 第二行:若干个整数,表示每种零钱的面值。

输出:

  • 分别输出贪心算法和动态规划算法得到的找零方案。

算法分析

贪心算法

贪心算法的核心思想是在每一步选择中都采取当前状态下最优的选择,从而希望导致最终结果最优。在找零钱问题中,贪心算法的策略是每次选择面值最大的零钱,尽可能多地使用这种零钱,直到无法再使用为止,然后继续选择次大的零钱,依此类推。

动态规划算法

动态规划算法通过把原问题分解为多个子问题来求解。对于找零钱问题,我们可以定义一个数组dp,其中dp[i]表示凑出金额i所需的最少零钱数量。通过填充电动态规划表,我们可以得到凑出总金额的最少零钱数,并通过回溯得到具体的找零方案。

代码实现

以下是使用C++实现的找零钱问题解决方案:

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

vector<int> greedyCoinChange(int Y, vector<int> coins) {
    sort(coins.rbegin(), coins.rend()); // 降序排列
    vector<int> result;
    int remaining = Y;
    for (int coin : coins) {
        while (remaining >= coin) {
            result.push_back(coin);
            remaining -= coin;
            if (remaining == 0) break;
        }
        if (remaining == 0) break;
    }
    return result;
}

vector<int> dpCoinChange(int Y, vector<int>& coins) {
    vector<int> dp(Y + 1, INT_MAX); 
    vector<int> coinUsed(Y + 1, 0); 
    dp[0] = 0;

    for (int i = 1; i <= Y; ++i) {
        for (int coin : coins) {
            if (coin <= i && dp[i - coin] != INT_MAX && dp[i - coin] + 1 < dp[i]) {
                dp[i] = dp[i - coin] + 1;
                coinUsed[i] = coin;
            }
        }
    }

    vector<int> result;
    int current = Y;
    while (current > 0) {
        int coin = coinUsed[current];
        result.push_back(coin);
        current -= coin;
    }
    // 动态规划结果按降序排列
    sort(result.rbegin(), result.rend());
    return result;
}

int main() {
    int n, Y;
    cin >> n >> Y;
    vector<int> coins(n);
    for (int i = 0; i < n; ++i) {
        cin >> coins[i];
    }

    // 贪心算法直接处理降序
    vector<int> greedyResult = greedyCoinChange(Y, coins);

    // 动态规划处理后排序
    vector<int> dpResult = dpCoinChange(Y, coins);

    // 格式化输出
    cout << Y << "=";
    for (size_t i = 0; i < greedyResult.size(); ++i) {
        if (i != 0) cout << "+";
        cout << greedyResult[i];
    }
    cout << endl;

    cout << Y << "=";
    for (size_t i = 0; i < dpResult.size(); ++i) {
        if (i != 0) cout << "+";
        cout << dpResult[i];
    }
    cout << endl;

    return 0;
}

代码解析

贪心算法函数 greedyCoinChange

  1. 将零钱面值按降序排列,这样可以优先使用面值较大的零钱。

  2. 初始化一个空向量 result 来存储找零方案。

  3. 使用一个循环遍历每种面值的零钱,尽可能多地使用当前面值的零钱。

  4. 当剩余金额为零时,结束循环并返回找零方案。

动态规划函数 dpCoinChange

  1. 初始化一个动态规划数组 dp,其中 dp[i] 表示凑出金额 i 所需的最少零钱数量。

  2. 初始化一个数组 coinUsed 来记录凑出每个金额时使用的最后一个零钱面值。

  3. 使用嵌套循环填充电动态规划表,外层循环遍历金额,内层循环遍历零钱面值。

  4. 通过回溯 coinUsed 数组构造找零方案。

示例输入与输出

输入

4 28
1 5 14 18

输出

28=18+5+5
28=14+14

总结

本文通过一个具体的找零钱问题,详细介绍了贪心算法和动态规划算法的实现过程。贪心算法简单直观,但在某些情况下可能无法得到最优解。而动态规划算法虽然时间复杂度较高,但可以保证得到最优解。在实际应用中,我们可以根据问题的具体特点选择合适的算法。希望本文能够帮助读者更好地理解和掌握这两种重要的算法设计策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作 MacOS系统 の Heic动态壁纸

了解动态桌面壁纸 当macOS 10.14发布后&#xff0c;会发现系统带有动态桌面壁纸&#xff0c;设置后&#xff0c;我们的桌面背景将随着一天从早上、到下午、再到晚上的推移而发生微妙的变化。 虽然有些软件也有类似的动态变化效果&#xff0c;但是在新系统中默认的HEIC格式的动…

大数据 笔记

kafka kafka作为消息队列为什么发送和消费消息这么快&#xff1f; 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把…

【数据库】-1 mysql 的安装

文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前…

物流项目第五期(运费计算实现、责任链设计模式运用)

前四期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 物流项目第四期&#xff08;运费模板列…

X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载

X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站&#xff0c;它能自动检测视频和图片&#xff0c;只需点击下载按钮即可完成下载。去除广告&#xff0c;解锁本地会员&#xff0c;享受无广告打扰的下载体验。 大小&am…

STM32 CAN CANAerospace

STM32的CAN模块对接CANAerospace 刚开始报错如下. 设备开机后整个CAN消息就不发了. USB_CAN调试器报错如下. index time Name ID Type Format Len Data00000001 000.000.000 Event 总线错误 DATA STANDARD 8 接收过程错误-格…

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…

服务器安装xfce桌面环境并通过浏览器操控

最近需要运行某个浏览器的脚本&#xff0c;但是服务器没有桌面环境&#xff0c;无法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce实现低占用的桌面环境&#xff0c;可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作&#xff0c;…

Oracle 创建外部表

找别人要一下数据&#xff0c;但是他发来一个 xxx.csv 文件&#xff0c;怎么办&#xff1f; 1、使用视图化工具导入 使用导入工具导入&#xff0c;如 DBeaver&#xff0c;右击要导入的表&#xff0c;选择导入数据。 选择对应的 csv 文件&#xff0c;下一步就行了&#xff08;如…

大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

【软考向】Chapter 9 数据库技术基础

基本概念数据库的三级模式结构 数据模型E-R 模型关系模型各种键完整性约束 关系代数5 种基本的关系代数运算&#xff1a;并、差、笛卡儿积、投影和选择扩展的关系代数运算&#xff1a;交(Intersection)、连接(Join)、除(Division)、广义投影(Generalized Projection)、外连接(O…

实战:Dify智能体+Java=自动化运营工具!

我们在运营某个圈子的时候&#xff0c;可能每天都要将这个圈子的“热门新闻”发送到朋友圈或聊天群里&#xff0c;但依靠传统的实现手段非常耗时耗力&#xff0c;我们通常要先收集热门新闻&#xff0c;再组装要新闻内容&#xff0c;再根据内容设计海报等。 那怎么才能简化并高…

STM32单片机GUI系统1 GUI基本内容

目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中&#xff0c;emWin、LVGL、TouchGFX 和 Qt 是…

应届本科生简历制作指南

一、找一个专业的简历模板 首先&#xff0c;你需要访问 Overleaf 的官方网站&#xff0c;也就是Overleaf, Online LaTeX Editor&#xff0c;进入页面后&#xff0c;点击注册按钮&#xff0c;按照提示填写相关信息来创建一个属于自己的账号&#xff0c;通常需要填写用户名、邮箱…

PyTorch可视化工具——使用Visdom进行深度学习可视化

文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…

企业级爬虫进阶开发指南

企业级爬虫进阶开发指南 一、分布式任务调度系统的深度设计 1.1 架构设计原理 图表 1.2 核心代码实现与注释 分布式锁服务 # distributed_lock.py import redis import timeclass DistributedLock:def __init__(self, redis_conn):self.redis = redis_connself.lock_key = …

网络安全-等级保护(等保) 2-7 GB/T 25058—2019 《信息安全技术 网络安全等级保护实施指南》-2019-08-30发布【现行】

################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…

数据结构实验10.1:内部排序的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容1. 数据生成与初始化2. 排序算法实现&#xff08;1&#xff09;直接插入排序&#xff08;2&#xff09;二分插入排序&#xff08;3&#xff09;希尔排序&#xff08;4&#xff09;冒泡排序&#xff08;5&#xff09;快速…

wps编辑技巧

1、编辑模式 2、图片提取方法&#xff1a;右键保存图片 可以直接右键保存下来看看是否是原始图&#xff0c;如果歪着的图&#xff0c;可能保存下来是正的&#xff0c;直接保存试下 3、加批注

开放世界RPG:无缝地图与动态任务的拓扑学架构

目录 开放世界RPG:无缝地图与动态任务的拓扑学架构引言第一章 地图分块系统1.1 动态加载算法1.2 内存管理模型第二章 任务拓扑网络2.1 任务依赖图2.2 动态可达性分析第三章 NPC行为系统3.1 行为森林架构3.2 日程规划算法第四章 动态事件系统4.1 事件传播模型4.2 玩家影响指标第…