硬币找钱问题(最小硬币和问题)详解与代码实现
设有6种不同面值的硬币,各硬币的面值分别为5分、1角、2角、5角、1元和2元。现在要用这些面值的硬币来购物和找钱。购物时可以使用的各种面值的硬币个数存于数组Coins[1:6]中,假设商店里各面值的硬币有足够多。对于给定的付款金额,计算使用硬币个数最少的交易方案。
输入数据的每一行有6个整数和一个有2位小数的实数,
分别表示可以使用的各种面值的硬币个数和付款金额。
输出为交易所需要的最少硬币个数,如果不可能完成交易,则输出“impossible”。
问题解释:
这里要注意一个点:
此处交易所需的最少硬币个数为 你支付的硬币个数 + 商店找给你的硬币个数。
例如:
一次购物需要支付0.95元,你可以给他的硬币组合为: 0.5 一个 + 0.2 两个 + 0.05 一个
0.5+0.2+.0.2+0.05=0.95
即 此处使用了四个硬币完成了交易。但我们发现,如果我们支付 一个 1 元的硬币,商店找回给我们一个0.05的硬币,仅需要两个硬币便完成的交易。
1-0.05=0.95
贪心算法:
所谓贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性。
贪心算法的基本思想:
解决本问题的关键在于找到贪心变量,本问题的贪心变量为实际支付金额。由于改变了支付面额的大小,以及商店会找零,就是对于这些硬币的排列组合。
步骤:
遍历备选的元素
选择贪心策略
I中剩余元素不发生变化,
I剩余元素不会变化。
接下来就是代码了,请自行观看:
def contains(a):for i in range(0,6):if (coinvalue[i] == a and coins[i] > 0):return ireturn -1def greed(coinvalue,changvalue,coins,Pay):global coinnumfor i in range(5, -1, -1):#从大到小遍历if coins[i] > 0:#如果顾客手里有剩余硬币for j in range(i):#商店的硬币从小到大遍历,进行找零realmoney = coinvalue[i] - changvalue[j]#实际上的支付金额=支付硬币的价值-商店找零的价值if Pay >= realmoney:#只有当实际支付金额效玉目标金额时才进行选取,否则需要增加找零硬币的金额(即,继续本层循环 j)if coins[i] >= Pay // realmoney:#如果当前面值硬币找零后足够支付余额tempcoinnum = Pay // realmoneycoinnum += tempcoinnum * 2#如果顾客有该硬币,则无需找零,因为找零会消耗两个硬币。if(contains(realmoney) != -1):tempcoinnum = min(tempcoinnum, coins[contains(realmoney)])coinnum -= tempcoinnumcoins[contains(realmoney)] -= tempcoinnumelse:coins[i] -= Pay // realmoneyPay = Pay % realmoneyif (contains(coinvalue[i]) == -1):breakelse:coinnum += coins[i]Pay = Pay - coinvalue[i] * coins[i]coins[i] = 0def outoutresult():if coinnum == 0 or Pay == 0:print("imossible !")else:print("支付和找零需要的最少总硬币数量:",coinnum)coinnum = 0
coinvalue = [5, 10, 20, 50, 100, 200]
changvalue = [0, 5, 10, 20, 50, 100, 200]
realmoney = 0
print("请输入需要支付的金额:")
costt = float(input())
Pay = int(costt * 100)
coins = []
print("请输入硬币个数:")
for i in range(0,6):coins.append(int(input()))
greed(coinvalue,changvalue,coins ,Pay)outoutresult()
硬币找钱问题(最小硬币和问题)详解与代码实现相关推荐
- 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!
一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...
- STM32最小系统硬件组成详解
STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 启动 1.电源 : 一般3.3V LDO供电 加多个0.01uf去耦电容 2.复位:有三种复位方式:上电 ...
- 数学建模——智能优化之遗传算法详解Python代码
数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...
- 数学建模——支持向量机模型详解Python代码
数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...
- TOPSIS(逼近理想解)算法原理详解与代码实现
写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...
- 一文速学数模-时序预测模型(四)二次指数平滑法和三次指数平滑法详解+Python代码实现
目录 前言 二次指数平滑法(Holt's linear trend method) 1.定义 2.公式 二次指数平滑值: 二次指数平滑数学模型: 3.案例实现 三次指数平滑法(Holt-Winters ...
- 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...
- 谱聚类算法详解及代码实现
谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...
- 扫描线填充多边形算法详解与代码
扫描线填充多边形算法详解与代码 首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色 class MyPolygon {public:int m_VerticeNumber;CPoin ...
- 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)
Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...
最新文章
- java爬树方法_Java-grandMother.java
- MySQL的4中隔离级别
- 【面试必备】静态路由与配置相关知识点详解
- ZOJ 1048|POJ 1004|HDU1064 Financial Management
- 【sprinb-boot】maven 多模块项目:单独 spring-boot:run 某个模块
- mysql5.0varchar_MySQL中varchar类型在5.0.3后的变化
- python信息传送管道_python – 获取返回管道输入的命令
- dubbo源码 -- 服务导出
- 配置思科交换机冗余链路汇聚
- linux网桥动态ip,使用Linux主机当网桥
- android 好用的工具,8款好玩实用APP推荐(安卓)
- excel流程图折线箭头_如何绘制excel箭头图形
- 顶部标题栏的布局设计
- c语言 end while,C语言报错:error: expected ‘while’ at end of input } ^
- CSS3炫酷的发光文字 可自定义文字色彩
- 毕业设计-基于微信小程序的电影票网购系统
- ADS designguide无法使用解决办法
- Linux 服务器一键测速脚本工具:GreenBench
- linux 添加快捷命令,linux 添加快捷指令
- (智能间距换行均满足)Excel中单元格批量调整行间距,行高自动适应内容,且自动换行
热门文章
- 单片机设计 指纹识别系统
- Matisse图片选择
- 飞秋在使用高分辨率的显示器时字体太小,应该这样设置就和以前一样
- (Codeforces800Div2)B. Paranoid String(思维/动态规划)
- android 那个桌面好,Hola桌面 可能是最好用的安卓手机桌面
- 朋友圈微信投票很麻烦?python开发个自动化刷票脚本,再也不用头痛了!
- unity ToggleGroup和Toggle.isOn的坑
- Windows10专业版重装系统教程
- oracle hugepage设置,Linux系统下快速配置HugePages的完整步骤
- 一个基于Angular4+Bootstrap4+Scss的后台管理系统界面