首页 > 编程语言 >24.贪心算法.

24.贪心算法.

时间:2023-06-25 18:45:58浏览次数:33  
标签:24 00 int money 算法 num 最优 贪心

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:

课程 开始时间 结束时间
美术 9:00 10:00
英语 9:30 10:30
数学 10:00 11:00
计算机 10:30 11:30
音乐 11:00 12:00

这个问题看似要思考很多,实际上算法很简单:

1.选择结束最早的课,便是要在这教室上课的第一节课

2.接下来,选择第一堂课结束后才开始的课,并且结束最早的课,这将是第二节在教室上的课。

重复这样做就能找出答案,这边的选择策略便是结束最早且和上一节课不冲突的课进行排序,因为每次都选择结束最早的,所以留给后面的时间也就越多,自然就能排下越多的课了。
每一节课的选择都是策略内的局部最优解(留给后面的时间最多),所以最终的结果也是近似最优解(这个案例上就是最优解)。
贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择不同的策略。

基本思路
其基本的解题思路为:
●建立数学模型来描述问题
●把求解的问题分成若干个子问题
●对每一子问题求解,得到子问题的局部最优解
●把子问题对应的局部最优解合成原来整个问题的一个近似最优解

完整代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 7

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

/**************************
*对输入的零钱数,找到至少要用的纸币的数量
*参数:
* money - 要找/支付的零钱数
*返回:
* 至少要用的纸币的数量,-1 表示找不开
*************************/
int solve(int money)
{
	int num = 0;
	int i = 0;

	for (i = N - 1; i >= 0; i--)
	{
		int j = money / value[i];
		int c = j > count[i] ? count[i] : j;

		money -= c * value[i];
		num += c;
	}

	if (money > 0) num = -1;

	return num;
}

int main()
{
	int money = 0;
	int num = 0;

	printf("请输入要支付的零钱的数额:\n");
	scanf_s("%s", &money);

	num = solve(money);

	if (num == -1) 
	{
		printf("对不起,找不开\n");
	}
	else 
	{
		printf("成功的使用至少%d 张纸币实现找零/支付!\n", num);
	}

	system("pause");
	return EXIT_SUCCESS;
}

参考资料来源:

奇牛学院

标签:24,00,int,money,算法,num,最优,贪心
From: https://www.cnblogs.com/codemagiciant/p/17503688.html

相关文章

  • 芝奇幻锋戟Z5 RGB DDR5-7200 24GB内存评测:稳上7800MHz、温度只有56度
    一、前言:7200MHzCL36高频内存仅需1.35V电压在DDR4年代,三星B-Die是当之无愧的超频王者,而今DDR5已然成为主流,大家公认的最好超频的颗粒是SK海力士A-Die。但并不是每一款采用了海力士A-Die颗粒的内存条都会有强悍的超频能力,这涉及到内存的电路设计、容量、散热设计等因素。比如不......
  • 3.数据结构与算法复习--线性表
    线性表的定义和特点线性表是具有相同特性的数据元素的一个有限序列(a1,a2,..ai-1,ai,ai+1,...an)a1:线性起点ai-1为ai的直接前驱,ai+1为ai的直接后驱an为线性终点,当n=0时称为空表线性表同一线性表中的元素必定具有相同特性,数据元素间的关系时线性关系线性表的逻辑特征是:......
  • 基于多算法融合的啸叫抑制方案总结
    前记 在对讲和本地扩音领域,啸叫抑制是一个无法绕过去的话题。怎么抑制啸叫是一个非常棘手的问题。笔者及团队在这个方向研究了好久。终于取得了一些阶段性的进展。这里做一下梳理。 心路历程 刚开始想依靠单纯的算法去解决。做了很多仿真,发现都不是很理想。不是抑制太狠了......
  • 【算法】罗马数字与整型数字转换,数值范围1-4000
    编写两个函数,将罗马数字与整数值进行转换。每个函数将测试多个罗马数字值。现代罗马数字是通过从最左边的数字开始分别表示每个数字,并跳过任何值为零的数字来书写的。在罗马数字1990中,表示为:1000=M,900=CM,90=XC;从而产生MCMXC。2008被写成2000=MM,8=VIII;或MMVIII。1666年,每一个罗马......
  • 反向传播算法的理解
    反向传播算法--求偏导速度大大提升(一次求解)https://zhuanlan.zhihu.com/p/250816711用计算图来解释几种求导方法:1.1计算图式子e=(a+b)∗(b+1) 可以用如下计算图表达:令a=2,b=1则有:      所以上面的求导方法总结为一句话就是:路径上所有边相乘,所有......
  • 22.回溯算法
    1.回溯的基本原理  在问题的解空间中,按深度优先遍历策略,从根节点出发搜索解空间树。算法搜索至解空间的任意一个节点时,先判断该节点是否包含问题的解。如果确定不包含,跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯,否则进入该子树,继续深度优先搜索。  回溯法解问题的......
  • Java实现扑克牌24点游戏
    游戏规则:4张扑克牌A~K分别代表1点至13点,要求4张牌加减乘除后得到点数为24.(除法必须整除)代码实现思路:构建初始变量实现初始化变量值实现运算分析可能出现的运算组合不考虑运算符优先级,组合3/5/7重复(最后会解释为什么不考虑运算符优先级,注1)代码实......
  • 机器学习十大算法---1.线性回归
    1.线性回归的模型函数和损失函数线性回归遇到的问题一般是这样的。我们有m个样本,每个样本对应于n维特征和一个结果输出,如下:我们的问题是,对于一个新的,他所对应的是多少呢?如果这个问题里面的y是连续的,则是一个回归问题,否则是一个分类问题。对于n维特征的样......
  • macOS 配置算法(第四版)的开发环境
    Java环境配置前往Adoptium下载他们预编译的JDK17(最新的LTS版本)的安装器,安装好之后,命令行执行java-version,输出如下:openjdkversion"17.0.7"2023-04-18OpenJDKRuntimeEnvironmentTemurin-17.0.7+7(build17.0.7+7)OpenJDK64-BitServerVMTemurin-17.0.7+7(b......
  • 语音信号的哈夫曼编码压缩解压缩算法matlab仿真,输出编码后数据大小,编码树等指标
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码......