C++贪心算法求解找零钱问题(很形象)

贪心算法求解找零钱问题

1.什么是贪心算法?

  1. 贪心算法是一种策略,总是做出在当前看来是最好的选择,总结出来几个字:寻找最优解

  2. 举个例子来说就是:“有一个只能往前走的果园,里边有各种水果让你免费摘,免费摘嘛当然找值钱的摘,所以一开始你就直接选择最贵的石榴,石榴摘完后再摘哪个?看看前边有香蕉和葡萄,比较了一下摘了香蕉,香蕉过后继续往前走,然后摘了橘子……,最后一条路走下来了,你摘了石榴、香蕉、橘子、苹果、桃子,总价值为25元”,故事到此结束,当你抱着一堆25元钱水果回来的时候,你已经寻找到了最优解,贪心算法就是这样的一种策略,根据眼前的条件进行取舍去寻找最优解;

2.找零钱问题构思

找零钱当然要尽快把钱找给对方,怎么做到最快,就是先取最大的钞票,然后再逐渐用小钞票,打个比方,如果你要找我32块钱,那最快的方法就是从你钱包里取出三张10块的,两张1块的, 利用贪心算法就是先看看最大钞票够不够找零,够的话先用最大的钞票,再用小的钞票;

3.代码部分

说了这么多,还是来看代码理解的快些。

#include<iostream>
using namespace std;

int main()
{
	int temp,num=0;		//temp为某种币值需要多少张钱,num为总共需要多少张
	int n=7;
	int moneylist[7] = { 5,1,2,3,2,4,1 };
	int moneyvalue[7] = { 1,2,5,10,20,50,100 };
	int k;		//要找的钱
	cout << "请输入要找的钱数" << endl;
	cin >> k;
	for (int i = 6; i >= 0; i--) {		//找零钱操作
		temp = k / moneyvalue[i];
		if (temp <= moneylist[i]) {
			num += temp;
			k -= temp * moneyvalue[i];
			cout << moneyvalue[i] << "元的钱" << temp << "张" << endl;
		}
		else {
			num += moneylist[i];
			k -= moneylist[i] * moneyvalue[i];
			cout << moneyvalue[i] << "元的钱" << moneylist[i] << "张" << endl;
		}
		if (k == 0) break;	
	}
	if (k != 0)  cout << "您还缺少" << k << "元去找零" << endl;
	if(k==0) cout << "一共至少需要" << num << "张纸币" << endl;
	return 0;
}

4. 运行结果

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

对于上边讲的摘水果问题想必你还有疑问,有没有一种路线使得自己拿的水果最值钱呢?有可能一开始选择最不值钱的桃子,接下来有可能会遇到榴莲、椰子等超级贵的水果,那么一路走下来摘的水果肯定比25元贵,所以如果有很多次机会去尝试的话,你肯定能找到一条最好的路线使拿到的水果最贵,至于这个过程,就是后续的推导整体最优解过程,这可能涉及回溯法等算法,有兴趣可以去了解一下。

今天就到这里,该吃饭了,拜。

  • 10
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值