算法设计与分析之贪心算法

这篇具有很好参考价值的文章主要介绍了算法设计与分析之贪心算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 贪心算法简介

贪心算法(Greedy Algorithm)是一种基于贪心思想的算法策略。它通过每一步选择当前状态下最优的解决方案,从而逐步得到全局最优解。贪心算法通常在问题具有贪心选择性质最优子结构性质时被应用。

贪心算法的基本思想是,每一步选择当前情况下看起来最好的解决方案,而不考虑之后可能发生的情况。它不进行回溯,也不考虑全局最优解,而是根据局部最优选择来构建解决方案。

适合贪心算法具有的特征:

1、优化问题。

2、问题的求解可以划分为若干阶段。

3、能够制定出最优量度标准。

4、问题具有最优子结构性质。

贪心算法的步骤通常如下:

1、确定问题的最优子结构:问题的最优解可以通过子问题的最优解来构建。

2、定义贪心选择策略:确定每一步的最优选择。

3、构建解决方案:根据贪心选择策略,逐步构建问题的解决方案。

4、验证解决方案:检查贪心算法得到的解决方案是否满足问题的要求。

2. 找零钱问题

关于贪心算法的一个经典例子是找零钱问题(Coin Change Problem)。问题描述如下:给定一些不同面额的硬币和一个需要找零的金额,找出最少的硬币数量来凑出该金额。利用贪心算法解决该问题的思路如下:

(1)输入找零的金额和每种硬币的面额;

(2)从币值从高到低进行贪心策略;

(3)选择所要表示的币值;

(4)记录所选择的币值所要的数目,现金值实时更改;

(5)输出结果。

算法实现

#include <iostream>
#include <vector>
#include <algorithm>
	
std::vector<int> greedyCoinChange(std::vector<int>& coins, int amount) {
	std::vector<int> result;
	
	// 按面额从大到小排序硬币
	// std::sort(coins.begin(), coins.end(), std::greater<int>());	// 与下一行功能相同
	std::sort(coins.rbegin(), coins.rend()); // c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
	
	for (auto coin : coins) {
		while (amount >= coin) {
			result.push_back(coin);
			amount -= coin;
		}
	}
	
	if (amount != 0) {
		// 找不到合适的硬币组合
		result.clear();
	}
	
	return result;
}
	
int main() {
	std::vector<int> coins = { 1, 5, 10, 25 };
	int amount = 47;
	
	std::vector<int> result = greedyCoinChange(coins, amount);
	
	if (!result.empty()) {
		std::cout << "找零的硬币数量:" << result.size() << std::endl;
		std::cout << "找零的硬币面额:";
		for (auto coin : result) {
			std::cout << coin << " ";
		}
		std::cout << std::endl;
	} else {
		std::cout << "无法找零。" << std::endl;
	}
	
	return 0;
}

在上述示例中,我们定义了一个greedyCoinChange函数,它接收一个硬币面额的向量coins和需要找零的金额amount。首先,我们将硬币面额按从大到小排序,以便每次选择最大面额的硬币。然后,我们循环遍历每个硬币,直到无法再选择该硬币为止。最后,如果剩余的金额不为0,则表示无法找零,返回空的结果。在main函数中,我们定义了一组硬币面额和需要找零的金额,并调用greedyCoinChange函数来获取找零的结果。如果结果不为空,我们输出找零的硬币数量和面额;否则,输出无法找零的信息。

例如,对于硬币面额为{1, 5, 10, 25},需要找零47的情况下,输出将会是:

找零的硬币数量:5
找零的硬币面额:25 10 10 1 1

这表示我们可以用5个硬币凑出47的金额,其中包括1个25分硬币、2个10分硬币和2个1分硬币。文章来源地址https://www.toymoban.com/news/detail-507975.html

到了这里,关于算法设计与分析之贪心算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【四】【算法分析与设计】贪心算法的初见

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i ,都有一个胃口值 g[i] ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 s[j] 。如果 s[j] = g[i] ,我们可以将这个饼干 j 分配给孩子

    2024年03月17日
    浏览(46)
  • 算法设计与分析实验:动态规划与贪心

    目录 一、零钱兑换 1.1 思路一:动态规划 1.2 思路二:贪心 二、安排工作以达到最大效益 2.1 具体思路 2.2 思路呈现 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、雇佣k名工人的最低成本 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 结尾语 “生活有意思的

    2024年02月19日
    浏览(75)
  • 计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)

     假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。 数据输入: 第 1 1 1 行中有一个整数 n n n ,表示有 n n n 个待安排的活动。接下来的 n n n 行中,每行有 2 2 2 个正整数,分别表示 n n n 个待安排的活动的开始时间和结束

    2024年02月02日
    浏览(44)
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

    算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征: 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性: 时间复杂性 和空间复

    2024年02月02日
    浏览(44)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(62)
  • 算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++)

    (一)题目 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有着不同颜色的最小着色数,相当于

    2024年02月07日
    浏览(95)
  • 数据结构与算法——贪心算法简介

    贪心算法是一种算法范式,它遵循在每个阶段做出局部最优选择的问题解决启发式,希望找到全局最优。换句话说,贪心算法在每一步都选择最好的选项,而不考虑该选择对未来步骤的影响。 当一个问题可以分解成更小的子问题,并且每个子问题的解决方案可以组合起来解决

    2023年04月08日
    浏览(37)
  • 算法设计方法之贪心算法

    贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。但结果不一定是最优的。 场景一 零钱兑换 现有硬币 1 元、2 元、5 元,需要用最少的硬币数量凑够 11 元。 利用贪心算法实现,优先考虑最好的结果就是面值为 5 元的硬币,11 = 5 +

    2024年02月17日
    浏览(45)
  • 【程序设计竞赛算法】背包问题——贪心法

    贪心算法是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。 背包问题是一个经典的组合优化问题,可以分为 0-1 背包问题和分数背包问题。其中,0-1 背包问题要求物品只能选择一次,而分数背包问题允许物品被选择多

    2024年02月03日
    浏览(44)
  • <算法>贪心策略设计并解决会场安排问题

    🎉  每个不曾起舞的日子都是对生命的辜负 🎉 写在前面 期末考试邻近,为了更好的应对《算法设计与分析》这门课程,我把书上以及老师讲过的案例都详细的做一个重现及解剖,让你熟记每一个潜在的考点,希望能给大家帮助。 🎉 目录 问题描述  贪心策略  算法设计

    2024年02月08日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包