贪心算法基本问题--C++

本文介绍了贪心算法的概念、特点及其应用,并通过一个找零问题的实例详细讲解了如何利用贪心算法进行求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.贪心算法

定义:贪心算法也叫贪婪算法,是指在求解问题时总是做出在当前看来是最好的选择。即不从整体最优方面考虑,仅是在某种意义上的局部最优解。

2.贪心算法的思路

从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。当达到算法的某一步不能继续前进时,就停止算法,给出一个近似解。
2.1贪心算法的三个问题
(1) 不能保证最后的解是最优解;
(2) 不能用来求最大或最小解问题;
(3) 只能求某些满足约束条件的可行解的范围。
2.2贪心算法的基本思路
(1) 建立数学模型来描述问题;
(2) 把求解的问题拆分成各个子问题;
(3) 对每一个子问题求解,得到子问题的局部最优解;
(4) 把子问题的最优解结合起来形成原问题的解。
2.3贪心算法的过程
(1) 从问题的某一初始解出发;
(2) while能向给定目标进一步;
(3) 求出可行解的一个解元素;
(4) 由所有解元素组合成问题的一个解。

3.贪心算法实例(C++)

  • 找零方案,人名币有100、50、10、5、1、0.5、0.1等多种面值,单位为元,在找零时有多种方案,例如68.90元,至少有一下三种方案:
    1张50 1张10 1张5 3张1 1张0.5 4张0.1;
    2张20 2张10 1张5 3张1 1张0.5 4张0.1;
    6张10 1张5 3张1 1张0.5 4张0.1;

  • 实现思路:将面值扩大100倍,只为简化运算过程;
    设计面值数组 Money[7] = {10000,5000,1000,500,100,50,10};
    设计计数数组 Num[7] = {0};
    Num数组与Money数组对应下标分别表示面值与面值数量;

#include<iostream>
#define MAXN 7
using namespace std;
double Money[MAXN] = { 10000, 5000, 1000, 500, 100, 50, 10 };
double Num[MAXN] = { 0 };
void exchange(double n)                   //n 为所找零钱扩大100倍后的值
{
	int i;
	for (i = 0; i < MAXN; i++)
		if (n > Money[i]) 
			break;                 //找到比n小的最大面值,Money数组内部值由大到小
	while (n > 0 && i < MAXN)
	{
		if (n >= Money[i])
		{
			n -= Money[i];
			Num[i]++;
		}else if (n < 10 && n >= 5) //此时考虑百分位上的数,四舍五入; 74.56-->74.6;  74.53-->74.5
		{
			Num[MAXN - 1]++;        //Money数组最后的最小值增一,表示四舍五入
			break;
		}
		else i++;
	}
}
int main()
{
	double m = 0;
	cout<<"请输入找零的金额:"<<endl;
	cin >> m;
	exchange(100*m);
	cout << m << "元零钱组成:" << endl;
	for (int i = 0; i < MAXN; i++)
	{
		if (Num[i] > 0)
		{
			cout << "面值 "<<Money[i] / 100 <<" ----共需要 "<< Num[i]<< " 张" << endl;
		}
	}
	//system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值