4-11 硬币找钱问题


问题描述

设有 6 种不同面值的硬币,各硬币的面值分别为 5 分,1 角,2 角,5 角,1 元,2 元。 现要用这些面值的硬币来购物和找钱。购物时可以使用的各种面值的硬币个数存于数组 Coins[1:6]中,商店里各面值的硬币有足够多。在 1 次购物中希望使用最少硬币个数。
例如,1 次购物需要付款 0.55 元,没有 5 角的硬币,只好用 2*20+10+5 共 4 枚硬币来 付款。如果付出 1 元,找回 4 角 5 分,同样需要 4 枚硬币。但是如果付出 1.05 元(1 枚 1 元和 1 枚 5 分),找回 5 角,只需要 3 枚硬币。这个方案用的硬币个数最少。

对于给定的各种面值的硬币个数和付款金额,编程计算使用硬币个数最少的交易方案。

数据输入:
每一行有 6 个整数和 1 个有 2 位小数的实数。分别表示可以使用的各种面值的硬币个数和付款金额。


Java

import java.util.Scanner;public class YingBiZhaoQian {private static int[] coins = new int[6];private static int[] c = {5, 10, 20, 50, 100, 200};private static int count = 0;private static int cost;public static void main(String[] args) {Scanner input = new Scanner(System.in);while (true) {count = 0;for (int i = 0; i < 6; i++) {coins[i] = input.nextInt();}double costt;costt = input.nextDouble();cost = (int) (costt * 100);getMinCount();}}private static void getMinCount() {for (int i = 5; i >= 0; i--) {  //先找面值较大的硬币if (coins[i] > 0) {  //如果硬币数量不为0,则可以用此面值硬币int[] cc = new int[i + 1];cc[0] = 0;for (int k = 1; k <= i; k++) {cc[k] = c[k - 1]; //相当于将c[0,i-1]复制到cc[1,i]}for (int j = 0; j <= i; j++) {if (cost >= (c[i] - cc[j])) {  //如果要找的钱数>=(当前硬币面值-(比当前硬币面值小的硬币||0)),即当前硬币面值可用//比如要找0.55元,2元数量为0,不可用,考察1元,1元-5角=5角<0.55元,1元可用if (coins[i] >= cost / (c[i] - cc[j])) { //如果已有硬币的数量>=?count += cost / (c[i] - cc[j]) + 1;  //总的要找的钱数+=?+1if (contains(c[i] - cc[j]) != -1) { //如果当前硬币面值-比它小的某一硬币面值恰好等于另外某一硬币面值count--;  //要找的总硬币数-1coins[contains(c[i] - cc[j])] -= cost / (c[i] - cc[j]); //另外某一硬币数量 -= ?System.out.print(" " + cc[j]);} else {  //如果当前硬币面值-比它小的某一硬币面值不等于另外某一硬币面值System.out.print(" " + c[i]);System.out.print(" " + cc[j]);coins[i] -= cost / (c[i] - cc[j]);}cost = cost % (c[i] - cc[j]);    //剩余要找的钱数if (contains(c[i]) == -1)break;} else {  //如果已有硬币的数量<?System.out.print(" " + c[i]);count += coins[i];  //总的要找的钱数 += 当前硬币的数量cost = cost - c[i] * coins[i];  //要找的钱数-已找的钱数coins[i] = 0;   //当前硬币数量用光}}}//剩下的钱不够支付了if (!checkLast(i, cost)) {//检查是否可以用当前的币值来支付int hasLest = cost / c[i] + 1;if (hasLest <= coins[i]) {count += hasLest;count += getBackMin(c[i] * hasLest - cost);cost = 0;break;} elsebreak;}}}if (count == 0 || cost != 0) {System.out.println("impossible");} else {System.out.println();System.out.println("Coins: " + count);System.out.println("-----------");}}private static int contains(int a) {for (int i = 0; i < 6; i++) {if (c[i] == a && coins[i] > 0)return i;}return -1;}private static int getBackMin(int k) {int count = 0;for (int i = 5; i >= 0; --i) {count += k / c[i];k = k % c[i];}return count;}private static boolean checkLast(int index, int co) {int sum = 0;for (int i = index - 1; i >= 0; --i) {sum += c[i] * coins[i];}if (co <= sum)return true;elsereturn false;}
}

Input & Output

2 4 2 2 1 0 0.95
 100 5
Coins: 2
-----------
2 4 2 0 1 0 0.55
 100 50 5
Coins: 3
-----------

Reference

王晓东《计算机算法设计与分析》(第3版)P132
https://blog.csdn.net/u012319493/article/details/50000539

算法设计与分析: 4-11 硬币找钱问题相关推荐

  1. 算法设计与分析之八枚硬币问题

    实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 实验目的 1.深 ...

  2. 算法设计与分析5.11求解满足方程解问题

    编写一个实验程序,求出a.b.c.d.e,满足ab-cd-e=1方程,其中所有变量的取值为1~5并且均不相同. 注:原书上的方程为ab-cd+e=1,该方程无解. 分析:采用回溯法,以找到变量的个数为 ...

  3. 算法设计与分析课程复习笔记11——单源最短路径

    算法设计与分析课程复习笔记11--单源最短路径 单源最短路径 最短路径问题 输入:有权有向图G=(V,E) 路径p={ v 0 , v 1 , . . . , v k v_0, v_1, . . . ...

  4. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  5. 算法设计与分析------蛮力法

    算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...

  6. 算法设计与分析课后总结

    算法设计与分析课后总结 算法设计与分析 第1章 算法设计基础 课后习题 第二章算法分析基础 课后习题 1.考虑下面算法,回答下列问题,算法完成什么功能?算法的基本语句时什么?基本语句执行了多少次? 2 ...

  7. 算法设计与分析(电子科技大学)(上)算法基础和贪心算法

    算法分析与设计 引论 (1)理解算法和程序的差别 (2)理解判断问题和优化问题这两类计算问题 1.理解指数增长的规模 2.理解渐进表达式 掌握渐进符号Ο.Θ.Ω的含义,能判断一个函数属于哪个渐近增长阶 ...

  8. 算法设计与分析基础-笔记-上

    算法设计与分析基础 绪论 什么是算法 一系列解决问题的明确指令,对于符合一定规范的输入,能够在有限的时间内获得要求的输出. 例子:最大公约数:俩个不全为0 的非负整数 m m m和 n n n的最大公 ...

  9. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

最新文章

  1. 天津春考计算机重点知识,天津春考第一学期期中试卷(计算机基础)
  2. RV1108之MiniGui显示参数配置
  3. CentOS6.5下RabbitMQ安装
  4. 小程序入门学习16--上传小程序至github
  5. array在java_在Java中的ArrayLists之间进行转换
  6. 8086汇编基础 inc 自加一
  7. ArcGIS利用DEM提取河流水系(附练习数据下载)
  8. 计算机两个硬盘的作用,固态硬盘时代谈谈双硬盘(固态+机械硬盘)的好处
  9. 西瓜书与蓝皮书 思维导图(转)
  10. 机器学习数据的预处理
  11. 管理工程师错误率较高的真题
  12. 串口通信协议简介—学习笔记
  13. HTML5和CSS3新特性(完整版)
  14. JavaEE学习第一天(HTML、CSS、js)
  15. group by 用法解析
  16. 计算机与我的工作 生活作文600字,我和电脑
  17. 【linux shell 相关】-8
  18. qt5 设置应用程序编码_2020年5大最佳编码应用
  19. 京东读书下载 --- 京东电子书阅读神器
  20. RFID电子标签对比传统条形码有哪些优势

热门文章

  1. 计算机中ar的作用,AR增强现实是什么意思?
  2. unity找隐藏游戏对象Gameobject
  3. Cisco网站系统测试考试题目及答案
  4. 新技能丨FETA40i-C核心板实现高清模拟摄像头720P方案
  5. castle典范英语 storm_求典范英语theMasked Cleaning Ladies 第二篇save the day梗概和
  6. 什么是“中间人攻击“?怎样防止这种攻击?
  7. Decide.com进军团购业务并推“退差价计划”
  8. 星座高考成绩查询2021,2021年能金榜题名的星座,2021年学业运势旺盛的星座
  9. 使用vue-quill-editor实现富文本编辑器(封装带移入提示)
  10. 阿翔编程学-系统安全