找零钱问题——贪心算法

蓝桥杯——算法训练——找零钱

有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
输入格式

第一行一个整数n,表示排队的人数
接下来n个整数a[1],a[2],…,a[n]。a[i]表示第i位学生手里钞票的价值(i越小,在队伍里越靠前)

输出格式 输出YES或者NO

样例输入_0

4
25 25 50 50

样例输出_0

YES

样例输入_1

2
25 100

样例输出_1

NO

样例输入_2

4
25 25 50 100

样例输出_2

YES

数据规模和约定
n不超过1000000
———————————————————————————————————————
思路分析:这道题的关键就是在模拟时贪一把(从大面额开始),基本思路主要在代码注释里,这里强调注意输出形式,一定要区分大小写。

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
int a[1000005];
int main(){int n;while(scanf("%d", &n) != EOF){memset(a, 0, sizeof(a));//把a个内存单元为a的设置初始值为0for(int i=0; i<n; i++) scanf("%d", &a[i]);//输入一个数,代表同学给阿姨的钱int m_25 = 0, m_50 = 0, m_100 = 0; // 分别用来存储阿姨手中不同面额纸币的数量,一开始的时候,阿姨手中的25 元,50元,100元的钞票都为0if(a[0] != 25)//如果其中一个同学一开始给的不是25,那么阿姨此时没得找,返回noprintf("NO\n"); // 这一点需要注意,由于阿姨手里一开始没有零钱,所以如果第一个人就给50,直接ggelse{m_25++; // 先拿一张25再说,25不需要找零bool flag = true; // bool值用来动态表示阿姨能否找回零钱,素衣阿姨可以支付,就是找回零钱for(int i=1 ;i<n; i++){// 阿姨收到钱首先会自动成为她的零钱库if(a[i] == 25) m_25++;//支付宝到账25元else if(a[i] == 50) m_50++;//支付宝到账50元else m_100++;//支付宝到账100元// 每一个人付的钱首先要减去25,余值才是阿姨需要找回的零钱额,这一点必须注意a[i] -= 25;//这个操作是上面三个情况都需要执行的操作,减去大盘鸡本身的价格25元,剩下的就是要找回的钱数// 三个while循环的顺序就是贪心策略的体现while(a[i] > 100 && m_100){a[i] -= 100;m_100--;//找零钱之后,阿姨手中的钞票要减少}while(a[i] > 50 && m_50){a[i] -= 50;m_50--;}while(a[i] > 0 && m_25){a[i] -= 25;m_25--;}if(a[i]){ // 如果应找零钱额不为0flag = false;break;}}if(flag) printf("YES\n");else printf("NO\n");}}return 0;
}

——————————————————————
给定了6种钱币面值为2、5、10、20、50、100,
用来凑 15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。
显然,最少需要2个钱币才能凑成15元。
你的任务就是,

给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。

我再说说我之前是怎么想的吧,我是想应该先从最大币值来依次找零,其实有时又要递归回去再判断,很麻烦的。

举个例子:31吧,从比不大于31的零钱来找零的过程是,36-20=16,16-10=6,6-5=1,到这发现没有零钱比这小了,所以得递归回去,1+5=6,因为刚刚减5行不通,所以得递推到上一步,那就往下一个小值找,那就是6-2=4,4-2=2,2-2=0这样找找到最小找零纸币数了。

这个过程可以用代码描述出来,我就是觉得麻烦,刚看到枚举还是很好接受的。

代码仅供参考,以后想到好方法会补上来。

#include<stdio.h> int main() { int a,b,c,d,e,f; int money; printf(“请输入所要找零的钱:”); scanf("%d",&money); int s=money/2+1;
//这个s初值为最多纸币数 int t=s; for(a=0;a<=money/2+1;a++) {
for(b=0;b<=money/5+1;b++) { for(c=0;c<=money/10+1;c++) {
for(d=0;d<=money/20+1;d++) { for(e=0;e<=money/50+1;e++) {
for(f=0;f<=money/100+1;f++) {
if(f100+e50+d20+c10+b5+a2= =money){
//printf("%d-%d-%d-%d-%d-%d\n",f,e,d,c,b,a); if(a+b+c+d+e+f<s)
s=a+b+c+d+e+f;
}
}
} } } } } if(s==t) printf(“找不到对应的零钱\n”); else printf(“所需最小纸币数为:%d\n”,s); return 0; }

程序大致流程:输入总额,输入最少找零纸币数。如果不能找到,则输入提示信息。
——————————————————————————
有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明)
输入格式
解题思路:

可以知道,50元和100元需要找钱,先满足找钱的条件,才能具体的操作找钱。

【1】50元需满足的找钱条件:阿姨口袋中25元钱的个数>=1;

【2】100元需满足的找钱条件:阿姨口袋中25元和50元各一张或者25元钱个数>=3;

【3】25元不需满足找钱条件;

AC代码:

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int a[1000000];
int main()
{int n,i;int money25=0;//阿姨口袋中25元的个数 int money50=0;//阿姨口袋中50元的个数 int money100=0;//阿姨口袋中100元的个数 cin>>n;for(i=0;i<n;i++)cin>>a[i];int flag=1;//阿姨是否可以给所有人成功找钱 for(i=0;i<n;i++){if(a[i]==50)//第i个人前面必须有一个25元 ,才符合找钱条件 {if(money25>=1)//符合找钱条件 {money25--;money50++; }else{flag=0;//找钱失败 break;}}else if(a[i]==100)//第i个人前面必须有一个25和50元或者3个25元 ,才符合找钱条件 {if(money50>=1&&money25>=1){money50--;money25--;money100++;}else if(money25>=3){money25-=3;money100++;}else{flag=0;//找钱失败 break;}}else//手里拿着的是25元,阿姨不用找钱 money25++;}	if(flag)cout<<"YES"<<endl;elsecout<<"NO"<<endl;return 0;
}

————————————————————————

Java版本

import java.util.*;public class Main {static Scanner sc = new Scanner(System.in);static int danjia = 25;static int xianyoudanjia = 0;public static void main(String[] args) {int n = sc.nextInt();int qian[] = new int[n];for (int i = 0; i < n; i++) {qian[i] = sc.nextInt();}Boolean bool = true; List<Integer> list = new ArrayList<>(); //利用List存放暂时找不开的人,先去一边排队去。//其实这个地方使用队列会更好。为了简便,我就没使用。//找钱for (int i = 0; i < qian.length; i++) {//如果第i个排队的人的钱足够if (qian[i] == danjia) {zongqianshu+= qian[i];//qian[i]>danjia:第i个人有的钱,大于单价,就说明要找钱了//(个人的钱 - 单价)=要找的钱,如果食堂阿姨现有的领钱>=要找的钱,说明可以找开} else if (qian[i] > danjia && ((qian[i] - danjia) <= zongqianshu)) {//找钱,找钱时要记得加上25,然后再减zongqianshu += 25;zongqianshu-= (qian[i] - danjia);//然后减去找去的钱}else{list.add(qian[i]);}}//找刚才没找开的for (int i = 0; i < list.size(); i++) {if(zongqianshu>=list.get(i)){zongqianshu -= list.get(i);list.remove(i); //找完要移除,因为已经找完第i个人了,剩下的就是没找的}else{bool = false;}}System.out.println(list.size()==0?"YES":"NO");//判断是否剩下没找钱的人}
}

人民币的面额有100元、50元、10元、5元、2元、1元等。在找零钱时,可以有很多中方案。例如146的找零方案如下:

(1)100+20+20+5+1
(2)100+20+10+10+5+1
(3)100+20+10+10+2+2+2
(4)100+10+10+10+10+1+1+1+1+1+1

【分析】

利用贪心算法,则选择的是第1种方案,首先选择一张面额最大的人民币,即100元面额的,然后在剩下的46元中选择面额最大的20元。依次选择的都是局部最优解。

code:

#include<stdio.h>
#include <iostream>
#define N 60
int exchage(float n, float *a, int c, float *r);//找零函数
void main()
{float rmb[] = { 100,50,20,10,5,2,1,0.5,0.2,0.1 };//代表人民币面值有这些int n = sizeof(rmb) / sizeof(rmb[0]), k, i;//用输入的需要找零的钱数除以最大的100面值float change, r[N];;//change需要找零的钱数,r【】存放那个需要几个printf("请输入要找的零钱数:");scanf("%f", &change);for (i = 0; i < n; i++)if (change >= rmb[i])//如果要找零的钱大于人民币已有的面值大小break;k = exchage(change, &rmb[i], n - i, r);if (k <= 0)printf("找不开!\n");else{printf("找零钱的方案:%.2f=", change);if (r[0] >= 1.0)printf("%.0f", r[0]);elseprintf("%.2f", r[0]);for (i = 1; i < k; i++){if (r[i] >= 1.0)printf("+%.0f", r[i]);elseprintf("+%.2f", r[i]);}printf("\n");}system("pause");
}
int exchage(float n, float *a, int c, float *r)
{int m;//开始不懂了。。。。。。。???????if (n == 0.0)				/*能分解,分解完成*/return 0;if (c == 0)				/*不能分解*/return -1;if (n < *a)return exchage(n, a + 1, c - 1, r);	/*继续寻找合适的面值*/else{*r = *a;					/*将零钱保存到r中*/m = exchage(n - *a, a, c, r + 1);		/*继续分解剩下的零钱*/if (m >= 0)return m + 1;			/*返回找零的零钱张数*/return -1;}
}

————————————————————————
在这里插入图片描述

#include<iostream>
using namespace std;
void find_change(int total_change)
{int Q, D, N, P;Q = D = N = P = 0;//用来计数,分别计算这几种钱需要多少张if ((total_change / 25 > 0) && (total_change > 10))//总的数首先要大于25{Q = total_change / 25;}int total_change_D = total_change % 25;//剩下来的需要找零得数if ((total_change_D / 10 > 0) && (total_change > 5)){D = total_change_D / 10;}int total_change_N = total_change_D % 10;if ((total_change_N / 5 > 0) && (total_change_D > 1)){N = total_change_N / 5;}P = total_change_N % 5;cout << "quarters Q = " << Q << endl;cout << "dimes    D = " << D << endl;cout << "nickles  N = " << N << endl;cout << "pennies  P = " << P << endl;
}//输出者几种钱的张数int main()
{int amount = 0;cout << "Please input the changes you need: " << endl;cin >> amount;find_change(amount);return 0;
}

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

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

相关文章

c语言 贪心算法 找零钱,贪心算法-找零钱(C#实现)

找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单,有注释 using System; using System.Collections.Generic; using Syst…

仿秒秒测日历页面和部分功能

秒秒测&#xff1a; 这里的农历和宜忌我们用的是这个lunar类库 <?phprequire Lunar.php;use com\nlf\calendar\Foto; use com\nlf\calendar\LunarYear; use com\nlf\calendar\util\HolidayUtil; use com\nlf\calendar\Lunar; use com\nlf\calendar\Solar;// 实例化 $sol…

蓝桥杯-算法训练-找零钱

问题描述   有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂阿姨足…

蓝桥杯全排列扩展(找零钱问题-java详解)

题目&#xff1a; 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂…

想搞钱,先培养商业思维!

昨天谈借助 ChatGPT 挣点房贷钱的时候&#xff0c;看评论区大家留言的时候&#xff0c;发现很多人不知道这个东西可以赚钱&#xff0c;或者说知道这个东西且也做了功课&#xff0c;无奈太忙最后也没搞到钱。 可以看到&#xff0c;大家的问题&#xff0c;归根于自己有没有商业思…

马云获聘香港大学荣誉教授;马斯克预计 2 个月内再次尝试发射星舰;​Rust 1.69.0 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

中科院发布多模态 ChatGPT,图片、语言、视频都可以 Chat ?中文多模态大模型力作...

进NLP群—>加入NLP交流群 夕小瑶科技说 原创作者 | 小戏、ZenMoore在 GPT-4 的发布报道上&#xff0c; GPT-4 的多模态能力让人印象深刻&#xff0c;它可以理解图片内容给出图片描述&#xff0c;甚至能在图片内容的基础上理解其中的隐喻或推断下一时刻的发展。 无疑&#xf…

有没有哪个瞬间,让你突然对ChatGPT感到失望? | AIGC实践

不知道你是否和我一样&#xff0c;在第一次使用ChatGPT输入Prompt&#xff0c;并得到答复的那一刻&#xff0c;都会忍不住地赞叹一句&#xff1a;握草。 但随着时间慢慢拉长&#xff0c;体验不断深入&#xff0c;想法也会慢慢改变…… 主题图 by Midjourney。Prompt&#xff1a…

Linux系统调用(2.哈工大OS实验二)

Linux系统调用与哈工大实验二 实验要求 此次实验的基本内容是&#xff1a;在Linux 0.11上添加两个系统调用&#xff0c;并编写两个简单的应用程序测试它们。 具体实验细节可以参考蓝桥云&#xff1a; https://www.lanqiao.cn/courses/115/learning/?id374&compatibility…

排好队,一个一个来:宫本武藏教你学队列(附各种队列源码)

文章目录 前言&#xff1a;理解“队列”的正确姿势一个关于队列的小思考——请求处理队列的两大“护法”————顺序队列和链式队列数组实现的队列链表实现的队列 循环队列关于开篇&#xff0c;你明白了吗&#xff1f;最后说一句 前言&#xff1a; 哈喽&#xff01;欢迎来到黑…

分享几个线上副业!!

线上副业 有哪些可以在线上运作就能赚取生活费的方式&#xff1f; 我这个暑假没有去打暑假工&#xff0c;因为疫情原因&#xff0c;一直待在家里&#xff0c;没有收入就不能出去玩&#xff0c;不能买漂亮衣服&#xff0c;就开始了一系列的线上兼职寻找&#xff0c;到处碰壁&…

学会Python如何去变现?副业月收入10000+了解一下

自学 Python 之后如果不去公司上班&#xff0c;自己一个人可以通过此技能挣什么钱&#xff1f; 逆天的Python&#xff0c;只要你掌握了相关技术&#xff0c;就可以靠它赚钱&#xff0c;具体怎么赚&#xff0c;我们来看看一位小哥哥的回答。 以我差不多四年的 Python 使用经验…

悟空问答赚钱副业项目,操作的好可月入10000+

我不知道你是否做过这种项目。这也是自媒体。如果你没有&#xff0c;你可以试试。收入不错。 有人可能会说悟空问答已经过时了。事实上&#xff0c;悟空问答每天仍能挣300元。好吧&#xff0c;我们已经取得了经验&#xff0c;在这里我们也与大家分享。 基本上&#xff0c;每个…

ChatGPT:编写一个带UI界面的计算器

代码&#xff1a; import tkinter as tkclass Calculator:def __init__(self, master):self.master mastermaster.title("Calculator")self.total tk.StringVar()self.entered_number tk.StringVar()self.entered_number.set(0)self.total.set(0)self.entry tk.…

使用Java进行编曲

一、编曲部分 1.1一丢丢乐理知识 简单普及下乐理哈&#xff0c;这样便于读谱 钢琴谱一行分两个部分 上面一行用右手弹(主奏)&#xff1b; 下面一行用左手弹奏(伴奏)。 1.2 关于节奏 &#xff08;1&#xff09;、主奏与伴奏中支持输入的35个音符&#xff1a; 倍低音&#…

小米系列手机(包括红米,黑鲨)开启调试模式

1. 点击我的设备 进入设置主页面&#xff0c;点击我的设备&#xff0c;点击全部参数。 2. 点击MIUI版本 连续点击MIUI版本直到出现提示&#xff0c;开发者权限已开启。 3. 点击更多设置 返回设置&#xff0c;点击更多设置。 4. 查看信息 在更多设置中就能看到开发者选项。 …

小米手机超越苹果,成欧洲第二;马斯克特斯拉内部邮件:痛恨开会,少讲黑话;Spring 6.0 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

MiPush四种推送对象

文档中心 推送对象目前支持四种&#xff1a;RegID、别名、userAccount、标签。 RegID&#xff1a;针对单一设备推送消息。应用调用MiPushClient类的静态方法registerPush注册小米推送服务&#xff0c;注册的结果将通过PushMessageReceiver继承类的onCommandResult方法和onRec…

小米正式宣布:这种手机以后买不到了…

开头先问大家一个问题&#xff0c;你的手机屏幕尺寸是多少&#xff1f; 还记得当初乔老爷子发布 iPhone 时&#xff0c;称 3.5 英寸是人手握持的最佳尺寸。 不过&#xff0c;当时苹果显然没有考虑到奥尼尔这样体格魁梧的人的使用感受... 3.5 英寸&#xff0c;4.0 英寸&#xf…

MIUI金凡回应用户反馈小米手机发热情况

本文转载自IT之家 IT之家 6 月 17 日消息 小米产品总监、MIUI 体验总负责人金凡近期称&#xff0c;已正式成立了“MIUI 先锋小组”&#xff0c;集中解决大家反馈的各类体验问题&#xff0c;做好首席客服小组。接下来会以报告的形式将工作进度发在小米社区中&#xff0c;请大家…