2019独角兽企业重金招聘Python工程师标准>>>

贪心算法——找纸币问题

问题主题:找钱

问题描述:

假设有1元、2元、5元、10元、20元、50元、100的纸币分别为c0, c1, c2, c3, c4, c5, c6,张。现在要用这些钱来支付K元,至少要用多少张纸币?如果能找,则输出纸币的张数,不能找则输出No

限制条件:

0<=c0, c1,c2,c3,c4,c5,c6<=109

0<=K<=109

样例:

输入

C0=3, c1=0, c2=2, c3=1, c4=0, c5=3, c6=5

输出

6

【解法一】

解题分析:

本题使用贪心算法,只需要考虑“尽可能多地使用面值大的纸币”,然后根据面值的大小从大到小排序依次选择。

程序实现:

C++

#include "iostream"

using namespace std;

const int N = 7;

static int K = 6200;

int min(int num1, int num2);

int momeyCount[N] = {3, 0, 2, 1, 0, 3, 5};

int value[N] = {1, 2, 5, 10, 20, 50, 100};

int giveChange() {

int num = 0;

for(int i = N-1; i >= 0; i --) {

int c = min(K/value[i], momeyCount[i]);

K = K - c * value[i];

num += c;

}

if(K > 0)

num = -1;

return num;

}

int min(int num1, int num2) {

return num1 < num2 ? num1 : num2;

}

int main() {

int result = giveChange();

if(result != -1)

cout << result << endl;

else

cout << "NO" << endl;

return 0;

}

Java

package greed;import java.util.Arrays;/*** 找钱问题* User: luoweifu* Date: 14-1-14* Time: 下午8:08*/
public class GiveChange {public static int gaiveChange(MoneyBox[] moneyBoxes, int target) {Arrays.sort(moneyBoxes);int count = 0;for(int i = moneyBoxes.length-1; i >= 0; i--) {int currentCount = Math.min(moneyBoxes[i].getCount(), target/moneyBoxes[i].getValue());target -= currentCount*moneyBoxes[i].getValue();count += currentCount;}if(target > 0) {count = -1;}return count;}public static void main(String args[]) {MoneyBox[] moneyBoxes = {new MoneyBox(1, 3),new MoneyBox(2, 0),new MoneyBox(5, 2),new MoneyBox(10, 1),new MoneyBox(20, 0),new MoneyBox(50, 3),new MoneyBox(100, 5),};int result = gaiveChange(moneyBoxes, 620);if(result > 0)System.out.println(result);elseSystem.out.println("No");}
}/*** 钱盒子*/
class MoneyBox implements Comparable{private int value;private int count;MoneyBox(int value, int count) {this.value = value;this.count = count;}int getValue() {return value;}void setValue(int value) {this.value = value;}int getCount() {return count;}void setCount(int count) {this.count = count;}@Overridepublic int compareTo(Object o) {MoneyBox moneyBox = (MoneyBox)o;if(this.value < moneyBox.getValue())return -1;else if(this.value == moneyBox.getValue())return 0;elsereturn 1;}
}

 

算法复杂度:

时间复杂度:如果纸币已经排序(如C++代码),O(n);如果纸币未经排序 (如Java代码),O(nlogn);

转载于:https://my.oschina.net/verynix/blog/365765

贪心算法——找纸币问题相关推荐

  1. c语言贪心算法找零问题,贪心算法-找零问题-实验报告

    <贪心算法-找零问题-实验报告>由会员分享,可在线阅读,更多相关<贪心算法-找零问题-实验报告(7页珍藏版)>请在人人文库网上搜索. 1.实验三 课程名称:算法设计与实现 实验 ...

  2. Java - 初探贪心算法(纸币找零,背包问题)

    贪心算法 1. 什么是贪心算法? 二.贪心算法的基本思路 三.贪心算法适用的问题 四.贪心算法的实现框架 五.贪心策略的选择 六.贪心算法的几个例子 1. 纸币找零问题 2. 背包问题 1. 什么是贪 ...

  3. 厉害了,学霸利用贪心算法找偷车贼

    转载自:公众号[超级数学建模] 作者:超模君 惹谁 都不要惹会算法的人 今天要讲的故事的主人公,是来自圣母大学计算机系的副教授史戈宇.就在不久之前,他还经历了一场惊心动魄的劫车事件. 度假旅游遇劫匪 ...

  4. 「算法学习」:贪心算法找零问题

    找零算法,找零??? 假设你是一个商店老板,你需要给顾客找零n元钱,你手上有的钱的面值为:100元,50元,20元,5元,1元.请问如何找零使得所需要的钱币数量最少? 例子:你需要找零126元,则所需 ...

  5. 贪心算法——找零钱问题

    假设有数目不限的面值为20,10,5,1的硬币. 给出需要找零数,求出找零方案,要求:使用数目最少的硬币. 对于此类问题,贪心算法采取的方式是找钱时,总是选取可供找钱的硬币的最大值.比如,需要找钱数为 ...

  6. 134. 加油站(贪心算法)

    在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其中的一个加 ...

  7. java零钱换整程序_贪心算法换零钱(java)

    贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解, ...

  8. 贪心算法在找钱问题上的使用

    背景: 对于现实生活中的找零问题,假设有数目不限,面值为20,10,5,1的硬币. 求出找零方案,要求:使用数目最少的硬币. 对于此类问题,贪心算法采取的方式是找钱时,总是选取可供找钱的硬币的最大值. ...

  9. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

最新文章

  1. oracle sql 平均分配 分组_SQL学习二
  2. Ubuntu 16.04 安装 CUDA、CUDNN 和 GPU 版本的 TensorFlow 一般步骤总结
  3. 装个Redmine真是麻烦啊
  4. 让数字校园走向云端【我身边的戴尔企业级解决方案】
  5. 基于h5的跳一跳游戏的开发与实现_「南宁小程序开发」企业开发小程序有哪些好处?...
  6. 七牛云存储Python SDK使用教程 - 上传策略详解
  7. python 处理python编码的基本过程
  8. RTP/RTCP/RTSP协议初探
  9. 李洋疯狂C语言之用递归解决李白喝酒问题(二)
  10. Qt工作笔记-3D效果唤出QWidgets界面(QGraphicsProxyWidget与QTimeLine)
  11. 在 linux 下安装 Mysql 的详细过程
  12. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端战五渣学JavaScript——Promise...
  13. java script 下载_JavaScript下载
  14. 电机与拖动matlab仿真,Matlab仿真软件在电机与拖动中的应用
  15. 短信下发的成功失败概率是多少?如何提高到达率?
  16. 海康视频android 开发实例,海康设备android播放器SDK
  17. VS2008SP1的MFC测试-(OFFICE2007风格)Ribbon风格(DJ尐舞图形画板2008)
  18. Makefile:14: config-host.mak: No such file or directory
  19. google 语音识别 VS 百度语音识别
  20. 蓝桥杯2017国赛 瓷砖样式 dfs+hush

热门文章

  1. Vue (响应式原理-模拟-0)
  2. PAT乙级 1029 旧键盘
  3. linux发布tomcat项目项目流程,linux下tomcat的配置及项目的部署流程
  4. typora插入代码设置_一篇文章教会你如何在Markdown文档中插入数学公式
  5. mysql自动提交的概念_MySQL入门之事务概念
  6. HDU 6581 Vacation
  7. C++03:论容器的使用
  8. core 中使用 swagger
  9. 我的开发笔记---UIPageControl的详细使用
  10. Mysql如何新建一个服务和移除所新建的服务