信奥赛CSP动态规划入门-最小硬币问题

针对**“最小硬币问题”**的详细分步解析与程序实现,通过将大问题分解为小问题的方式讲解动态规划的应用:


一、问题拆解步骤

1. 明确问题定义

大问题:用面值1元和5元的硬币凑出N元,最少需要多少枚硬币
小问题:凑出k元(0 ≤ k ≤ N)所需的最小硬币数。

2. 状态定义
  • 定义数组dp[i] 表示凑出i元所需的最小硬币数
  • 物理意义:每个dp[i]都是独立的小问题解
3. 初始条件
金额最小硬币数解释
0元0不需要任何硬币
1元1只能用1个1元硬币
2元2两个1元硬币
逐步推导到目标金额
4. 状态转移方程

递推逻辑
对每个金额i,尝试使用所有可能的硬币面值coin,取最小值:

dp[i] = min(dp[i], dp[i - coin] + 1)

二、分步程序实现

#include <iostream>
#include <algorithm>  // 使用min函数
using namespace std;int main() {int coins[] = {1, 5};      // 硬币面值int target;                // 目标金额cout << "请输入目标金额:";cin >> target;// 步骤1:初始化dp数组int dp[100];               // 假设最大金额不超过99元fill(dp, dp + 100, 999);   // 初始化为极大值(代表不可达)dp[0] = 0;                 // 凑0元需要0个硬币// 步骤2:逐个解决小问题for (int i = 1; i <= target; i++) {  // 从1元开始计算// 尝试每一种硬币for (int coin : coins) {         // C++11范围循环if (i >= coin) {             // 确保不会出现负数// 状态转移:用更小问题的解构建当前解dp[i] = min(dp[i], dp[i - coin] + 1);}}}// 步骤3:输出最终解if (dp[target] != 999) {cout << "最少需要 " << dp[target] << " 枚硬币" << endl;} else {cout << "无法凑出目标金额!" << endl;}return 0;
}

三、动态规划过程演示(以target=10为例)

1. 初始化数组
金额012345678910
dp值0
2. 逐步填充过程
  • i=1元
    • 尝试1元硬币:dp[1] = min(∞, dp[0]+1) = 1
    • 5元硬币不可用
  • i=5元
    • 尝试1元硬币:dp[5] = min(∞, dp[4]+1) = ∞
    • 尝试5元硬币:dp[5] = min(∞, dp[0]+1) = 1
  • i=10元
    • 尝试1元硬币:dp[10] = dp[9]+1 = 2+1=3
    • 尝试5元硬币:dp[10] = dp[5]+1 = 1+1=2
3. 最终结果
金额012345678910
dp值01234123452

四、关键点解析

  1. 大问题化小问题

    • 将"凑10元"分解为"凑1元、2元…9元"的子问题
    • 每个子问题的解都记录在dp[]数组中
  2. 递推关系本质

    凑i元的最优解 = min(凑(i-1元)的最优解 + 1个1元硬币,凑(i-5元)的最优解 + 1个5元硬币
    )
    
  3. 时间复杂度:O(M×N)

    • M为硬币种类数,N为目标金额

五、测试样例

输入输出解释
10最少需要2枚硬币5+5
13最少需要3枚硬币5+5+1+1+1 → 5+5+3(错误!实际应为5+5+3不存在,正确应为5+5+1+1+1=5枚?这里需要验证)
0最少需要0枚硬币无需硬币
3最少需要3枚硬币1+1+1

注意:测试时需确保硬币面值数组与实际题目一致


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

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

相关文章

docker多阶段构建镜像

工作中常常用到docker&#xff0c;现在有这样一个场景&#xff1a;已经有一个打好的docker镜像A&#xff0c;主要是包含系统文件(1-3G)、pyhton env(9-10G)文件、模型权重文件modelA(65G)和python代码文件。同时重新安装pyhton env耗时很久(安装torch/cuda/sglang)等等。现在要…

目标检测 RT-DETR(2023)详细解读

文章目录 主干网络&#xff1a;Encoder&#xff1a;不确定性最小Query选择Decoder网络&#xff1a; 将DETR扩展到实时场景&#xff0c;提高了模型的检测速度。网络架构分为三部分组成&#xff1a;主干网络、混合编码器、带有辅助预测头的变换器编码器。具体来说&#xff0c;先利…

学习 Pinia 状态管理【Plan - May - Week 2】

一、定义 Store Store 由 defineStore() 定义&#xff0c;它的第一个参数要求独一无二的id import { defineStore } from piniaexport const useAlertsStore defineStore(alert, {// 配置 })最好使用以 use 开头且以 Store 结尾 (比如 useUserStore&#xff0c;useCartStore&a…

智能制造:基于AI制造企业解决方案架构设计【附全文阅读】

该方案面向制造企业管理者、技术工程师及智能制造转型需求企业&#xff0c;聚焦AI技术在制造业的落地应用。核心内容以AI开放平台为基础&#xff0c;构建“感知层-算法层-平台层-认知层”技术架构&#xff0c;提供从数据采集、模型训练到智能检测的全流程解决方案。 方案通过机…

JVM 高质量面试题

📌 文章目录 一、JVM 内存结构与运行时模型1. JVM 内存结构分区及作用2. 栈帧结构及方法调用链维护3. 逃逸分析及其对对象分配策略的影响4. TLAB 的作用及提升对象创建效率的机制二、垃圾回收器与 GC 调优1. CMS 与 G1 垃圾收集器的设计区别及适用场景2. Full GC 频繁问题的排…

使用Spring Boot和Spring Security构建安全的RESTful API

使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中&#xff0c;安全性是一个不可忽视的重要方面。Spring Boot和Spring Security是Java生态中广泛使用的框架&#xff0c;它们提供了强大的工具来保护RESTful API。本文将介绍如何结合这两个框架&am…

Web项目流程总结

前端 1.下载pnpm管理器 pnpm是一种JavaScript包管理器。 前提&#xff1a;确保安装了Node.js 和 npm 打开cmd&#xff0c;以管理员身份运行&#xff08;输入以下指令&#xff09; npm install -g pnpm 安装成功后显示&#xff1a; npm: 这是 Node.js 的包管理工具&#xf…

Java中static关键字深度解析:从入门到高阶实战

Java中static关键字深度解析&#xff1a;从入门到高阶实战 目录 static的本质与核心特性静态变量 vs 实例变量&#xff1a;底层对比静态方法的设计哲学与应用场景高级用法&#xff1a;突破常规的static技巧 4.1 静态代码块&#xff1a;类加载的“初始化引擎”4.2 静态内部类&…

学习人工智能:从0到1的破局指南与职业成长路径

当AI绘画工具在几秒内生成一幅媲美专业画师的作品&#xff0c;当AI程序员自主优化代码逻辑&#xff0c;当AI客服精准解答复杂问题——一个现实愈发清晰&#xff1a;人工智能&#xff08;AI&#xff09;不再是科技公司的专属游戏&#xff0c;而是每个普通人必须直面的时代命题。…

2025年医美行业报告60+份汇总解读 | 附 PDF 下载

原文链接&#xff1a;https://tecdat.cn/?p42122 医美行业在消费升级与技术迭代的双重驱动下&#xff0c;已从边缘市场逐步走向主流。数据显示&#xff0c;2024 年中国医美市场规模突破 3000 亿元&#xff0c;年复合增长率达 15%&#xff0c;但行业仍面临正品率不足、区域发展…

深入了解Springboot框架的启动流程

目录 1、介绍 2、执行流程 1、运行run方法 2、初始化SpringApplication对象 1、确定容器类型 3、加载所有的初始化器 4、加载Spring上下文监听器 5、设置程序运行的主类 3、进入run方法 1、开启计时器 2、Headless模式配置 3、获取并启用监听器 4、准备环境 1、设…

【Java多态】:灵活编程的核心

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 【前言】 在Java面向对象编程的世界中&#xff0c;多&#xff08;Polymorphism&#xff09; 是一个核…

Python打卡训练营day33——2025.05.22

知识点回顾&#xff1a; PyTorch和cuda的安装 查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; cuda的检查 简单神经网络的流程 数据预处理&#xff08;归一化、转换成张量&#xff09; 模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 定义损失函数和优…

uni-app学习笔记九-vue3 v-for指令

v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; <template><view v-for"(item,index) in 10" :key"index"…

【C++算法】70.队列+宽搜_N 叉树的层序遍历

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 429. N 叉树的层序遍历 题目描述&#xff1a; 解法 使用队列层序遍历就可以了。 先入根节点1。queue&#xff1a;1 然后出根节点1&#xff0c;入孩子节点2&#xff0c;3&a…

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…

【机器学习基础】机器学习入门核心算法:线性回归(Linear Regression)

机器学习入门核心算法&#xff1a;线性回归&#xff08;Linear Regression&#xff09; 1. 算法逻辑2. 算法原理与数学推导3. 评估指标4. 应用案例5. 面试题6. 扩展分析总结 1. 算法逻辑 核心思想 通过线性方程拟合数据&#xff0c;最小化预测值与真实值的误差平方和&#xff0…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 &#xff08;话术脚本与实战&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音应答&#xff08;二&#xff09; 下一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音…

flutter dart class语法说明、示例

&#x1f539; Dart 中的 class 基本语法 class ClassName {// 属性&#xff08;字段&#xff09;数据类型 属性名;// 构造函数ClassName(this.属性名);// 方法返回类型 方法名() {// 方法体} }✅ 示例&#xff1a;创建一个简单的 Person 类 class Person {// 属性String name;…

Apollo10.0学习——planning模块(10)之依赖注入器injector_

好不好奇injector_是干什么用的&#xff1f;为什么planning每个模块都要初始化这个变量&#xff1f; 类功能概述 DependencyInjector&#xff08;依赖注入器&#xff09;是一个 集中管理规划模块关键数据和服务 的容器类。它通过提供统一的访问接口&#xff0c;解耦各个组件之…