当前位置: 首页 > news >正文

选硬币该用动态规划

选硬币:
现有面值分别为1角1分,5分,1分的硬币,请给出找1角5分钱的最佳方案。

#include <iostream>
#include <vector>std::vector<int> findChange(int amount) {std::vector<int> coins = {11, 5, 1}; // 按面值从大到小排序的硬币面值std::vector<int> result(coins.size(), 0); // 用于存储每种硬币的数量for (int i = 0; i < coins.size(); i++) {int numCoins = amount / coins[i]; // 计算当前硬币面值的数量result[i] = numCoins; // 存储数量amount -= numCoins * coins[i]; // 更新剩余金额}return result;
}int main() {int amount = 15; // 需要找零的金额,单位为分std::vector<int> change = findChange(amount);std::cout << "找零方案为:" << std::endl;std::cout << "1角1分硬币数量:" << change[0] << std::endl;std::cout << "5分硬币数量:" << change[1] << std::endl;std::cout << "1分硬币数量:" << change[2] << std::endl;return 0;
}

一开始我想的很简单,以为是简单的求整除数。
但要是你仔细一想,这肯定是不对的,不是所有问题都能用贪心。
在求最优的过程中,贪心和动态规划一直是一对冤家,到底选择哪个,难道了很多英雄好汉,所以最好的方式就是具体问题具体分析,只有结合实际情况才能选出最适合问题的算法。
我们都知道贪心的局限性,只能求出其中一个解的,但是不是最优需要考量。
让我们来看一下用上面贪心求出来的解:
在这里插入图片描述
但这肯定不是最优解,我们在找零的时候遵循的规则是用最少的钱张数交给别人,这样才方便。
所以最佳找零方案为:
1角1分硬币数量:0
5分硬币数量:3
1分硬币数量:0
让我们来看看用动态规划写出来的代码:

#include <iostream>
using namespace std;const int N = 10005;
const int INF = 0x3f3f3f3f; 
int f[N], a[N];int main() {int n, w;cin >> n >> w;for (int i = 0; i < n; i++) {cin >> a[i];}for (int i = 1; i <= w; i++) {f[i] = INF;}for (int i = 0; i < n; i++) {for (int j = a[i]; j <= w; j++) {f[j] = min(f[j], f[j - a[i]] + 1);}}if (f[w] == INF) {cout << -1; } else {cout << f[w];}return 0;
}

在这里插入图片描述
结果和我们预期的完全一样

总结

选硬币在动态规划中是一种叫状态表示的题型,通常用一维/二维的数组组成状态转移方程,通过更新数组来达到获取最优解的目标

相关文章:

  • 【漏洞复现】泛微e-Weaver SQL注入
  • ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么
  • zookeperkafka学习
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • Linux操作系统使用及C高级编程-D5Linux shell命令(进程管理、用户管理)
  • 黑马React18: 基础Part 1
  • 遗传算法GA-算法原理与算法流程图
  • 搭建 AI 图像生成器 (SAAS) php laravel
  • python django 小程序博客源码
  • 杭州-区块链前瞻性论坛邀请函​
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • 基于STM32的多组外部中断(EXTI)的优化策略与应用
  • 春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)
  • 阿里面试面试题
  • Linux非阻塞等待示例
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Angular 响应式表单之下拉框
  • C++入门教程(10):for 语句
  •  D - 粉碎叛乱F - 其他起义
  • httpie使用详解
  • JDK 6和JDK 7中的substring()方法
  • log4j2输出到kafka
  • MaxCompute访问TableStore(OTS) 数据
  • October CMS - 快速入门 9 Images And Galleries
  • Redis在Web项目中的应用与实践
  • Xmanager 远程桌面 CentOS 7
  • 理解在java “”i=i++;”所发生的事情
  • 如何胜任知名企业的商业数据分析师?
  • 06-01 点餐小程序前台界面搭建
  • ​卜东波研究员:高观点下的少儿计算思维
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $GOPATH/go.mod exists but should not goland
  • (16)Reactor的测试——响应式Spring的道法术器
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)pulsar安装在独立的docker中,python测试
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (南京观海微电子)——COF介绍
  • (算法)Game
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)socket Aio demo
  • (转)Windows2003安全设置/维护
  • (转)项目管理杂谈-我所期望的新人
  • . Flume面试题
  • .NET Core 项目指定SDK版本
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net的DataSet直接与SQL2005交互
  • .net经典笔试题
  • .NET开源快速、强大、免费的电子表格组件
  • .Net中ListT 泛型转成DataTable、DataSet