C++古老算法介绍

本篇文章我们来介绍一下常用算法

1.贪心算法

贪心算法(Greedy Algorithm)是一种解决问题的策略,它在每一步都做出当前看来最优的选择,而不考虑全局最优解。(局部最优解得到整体最优解)贪心算法通常适用于满足"贪心选择性质"和"最优子结构性质"的问题。

贪心算法使用条件:

贪心算法适用的条件包括两个性质:贪心选择性质和最优子结构性质。

  1. 贪心选择性质(Greedy Choice Property):通过每一步的局部最优选择,能够得到全局最优解。也就是说,在每一步选择中,都做出当前看起来最好的选择,而不考虑对后续步骤的影响。

  2. 最优子结构性质(Optimal Substructure):问题的最优解包含了子问题的最优解。换句话说,通过求解子问题的最优解,可以推导出原问题的最优解。

当一个问题满足这两个性质时,可以考虑使用贪心算法来求解。但需要注意,并非所有问题都满足这两个性质,所以不能盲目地应用贪心算法。

代码实例:

以下是一个使用贪心算法解决找零钱问题的示例(经典):

假设有面额为1元、5元、10元、25元的硬币,现在要找零给定金额的钱数,求最少需要多少个硬币。

#include <iostream>
#include <vector>std::vector<int> greedyCoinChange(int amount, std::vector<int>& coins) {std::vector<int> result;for (int i = coins.size() - 1; i >= 0; i--) {while (amount >= coins[i]) { // 尽可能多地选择当前面额的硬币result.push_back(coins[i]);amount -= coins[i];}}return result;
}int main() {int amount = 48;std::vector<int> coins = {25, 10, 5, 1};std::cout << "Amount: " << amount << std::endl;std::cout << "Coins used: ";std::vector<int> result = greedyCoinChange(amount, coins);for (int coin : result) {std::cout << coin << " ";}std::cout << std::endl;return 0;
}

这段代码中,我们从最大面额的硬币开始选择,如果当前金额仍然大于等于当前面额的硬币,则选择该硬币,并减去相应的金额。重复这个过程直到金额变为0。

贪心算法在此问题中能够得到最优解,因为每次选择都是局部最优的。但需要注意的是,贪心算法并不适用于所有问题,有些问题可能需要动态规划等其他方法来求解。在使用贪心算法时,需要仔细分析问题性质,并确保它满足贪心选择性质和最优子结构性质。

2.递归算法

递归算法是一种通过调用自身来解决问题的算法。它将一个大问题分解为一个或多个相同或类似的子问题,并通过逐级求解子问题来达到最终解决整个问题的目的。

递归算法通常包含以下两个重要组成部分:

  1. 基本情况(Base Case):确定递归算法何时停止,不再进行递归调用。基本情况应该是最简单的情况,无需进一步递归求解即可得到结果。

  2. 递归调用(Recursive Call):在算法中使用相同的函数来解决规模更小的子问题。通过反复调用自身,将大问题转化为规模较小且相同性质的子问题。

在编写递归算法时,需要注意以下几点:

  • 确保每次递归调用都能使问题规模减小,否则可能会导致无限循环。
  • 保证基本情况被正确处理,确保最终可以终止递归过程。
  • 尽量避免重复计算和重复工作,利用已经计算过的结果进行缓存或剪枝操作。

斐波那契数列

#include <iostream>int fibonacci(int n) {if (n <= 0) {return -1; // 错误情况,返回负数表示错误} else if (n == 1 || n == 2) {return 1; // 基本情况,斐波那契数列的第一项和第二项为1} else {return fibonacci(n - 1) + fibonacci(n - 2); // 递归调用求解前两个斐波那契数之和}
}int main() {int n = 6;int result = fibonacci(n);std::cout << "第 " << n << " 个斐波那契数是:" << result << std::endl;return 0;
}

回溯法:

回溯法(Backtracking)是一种解决问题的算法思想,通常用于求解在给定约束条件下的所有可能解。它通过尝试所有可能的选择,并逐步构建出候选解,如果当前构建的部分无法满足问题的限制条件,就会回溯到上一个状态进行其他选择。

八皇后问题 

#include <iostream>
#include <vector>using namespace std;bool isValid(vector<int>& board, int row, int col) {for (int i = 0; i < row; ++i) {if (board[i] == col || abs(board[i] - col) == abs(i - row)) {return false;}}return true;
}void backtrack(vector<vector<string>>& res, vector<int>& board, int row, int n) {if (row == n) {vector<string> solution(n, string(n, '.'));for (int i = 0; i < n; ++i) {solution[i][board[i]] = 'Q';}res.push_back(solution);} else {for (int col = 0; col < n; ++col) {if (isValid(board, row, col)) {board[row] = col;backtrack(res, board, row + 1, n);board[row] = -1;}}}
}vector<vector<string>> solveNQueens(int n) {vector<vector<string>> res;vector<int> board(n, -1);backtrack(res, board, 0, n);return res;
}int main() {int n = 4;vector<vector<string>> solutions = solveNQueens(n);for (const auto& solution : solutions) {for (const auto& row : solution) {cout << row << endl;}cout << "----------------" << endl;}return 0;
}

在这个示例中,我们通过回溯法解决了八皇后问题。solveNQueens 函数返回了一个二维数组,其中每个元素代表一种合法的八皇后布局。

回溯算法的关键在于 isValidbacktrack 函数。isValid 函数用于判断当前位置是否可以放置皇后,而 backtrack 函数用于递归地尝试所有可能的选择,并生成符合要求的解。

总结:本篇文章讲了一些常用的数据结构算法    如贪心算法 回溯法 递归算法 等   掌握,每一个算法的精髓 才行 根据不同的场景使用不同的算法 能达到意想不到的效果

好了 本篇文章就到这里 在这里小编想向大家推荐一个课程 课程质量杠杠的

https://xxetb.xetslk.com/s/2PjJ3T

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

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

相关文章

2.15 字符串练习

1、选择题 1.1、有以下程序 int main() { char a[7]"a0\0a0\0";int i,j; isizeof(a); jstrlen(a); printf("%d %d\n",i,j); } //strlen求出字符串的长度&#xff0c;其实是字符串中字符的个数&#xff0c;不包括\0 程序运行后的输出结果是 C…

【BIP39和BIP44】

现在的区块链地址通常是基于BIP39和BIP44提案的&#xff0c;这两个提案定义了助记词和确定性钱包的标准。 BIP39&#xff08;确定性钱包种子助记词&#xff09;: BIP39提案描述了一种生成和恢复助记词的方法&#xff0c;这些助记词可以用于生成加密货币的私钥和地址。 助记词…

K210开发环境搭建(VS Code)

一、新建一个文件夹&#xff0c;就叫K210 二、再K210文件夹里面再新建一个文件夹&#xff0c;就叫CMake 三、找到官方提供的资料包里的cmake安装包&#xff0c; 或者直接去cmake官方下载网址进行下载 CMake官方下载网址&#xff1a;https://cmake.org/download/ 四、双击安装…

12.object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别

扩展运算符&#xff1a; let outObj {inObj: {a: 1, b: 2} } let newObj {...outObj} newObj.inObj.a 2 console.log(outObj) // {inObj: {a: 2, b: 2}}Object.assign(): let outObj {inObj: {a: 1, b: 2} } let newObj Object.assign({}, outObj) newObj.inObj.a 2 co…

Screw自动生成数据库文档

Screw简介 官方地址 Screw可以根据数据库中的表自动生成HTML、Word、Markdown格式的文档。 Springboot 3.1集成 生成Springboot项目 Spring Initializr Maven依赖 <dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</…

Nginx实战:日志按天分割

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、方式1&#xff1a;定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2&#xff1a;logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…

FT2232调试记录(3)

FT2232调试记录&#xff08;1&#xff09;: FT2232调试记录&#xff08;2&#xff09;: FT2232调试记录&#xff08;3&#xff09;: FT2232 SPI读写函数: 参照SPI提供的文档&#xff1a; 工程&#xff1a; SPI 写函数&#xff1a; FT_STATUS write_byte(FT_HANDLE handle…

再利用系统盘时,如何删除恢复分区(Recovery Partition)

系统盘有一个Recovery Partition&#xff0c;记录了重要的系统信息&#xff0c;不能删除。 Windows 10的 Disk Managment 不提供用户删除这个Partition的选项。 近日我插入一块原系统盘&#xff0c;Format后作为DataDisk&#xff0c;此时需要删除这块硬盘上的RecoveryPartition…

MySQL中常见的几种日志类型【重点】

在MySQL中&#xff0c;有几种不同类型的日志&#xff0c;用于记录数据库的活动和操作&#xff0c;以便于故障排查、性能调优和数据恢复等目的。以下是MySQL中常见的几种日志类型&#xff1a; 错误日志&#xff08;Error Log&#xff09;&#xff1a; 错误日志记录了MySQL服务器…

vue3 封装一个通用echarts组件

实现这个组件需要引入echarts和vue-echarts插件&#xff0c;使用vue-echarts是因为它帮我们封装了一些很常用的功能&#xff0c;比如监听页面resize后重新渲染功能&#xff0c;本次组件只使用到了autoresize配置&#xff0c;其它可以根据官方文档按需选配 https://github.com/…

11.JavaScript 中如何进行隐式类型转换?

首先要介绍ToPrimitive方法&#xff0c;这是 JavaScript 中每个值隐含的自带的方法&#xff0c;用来将值 &#xff08;无论是基本类型值还是对象&#xff09;转换为基本类型值。如果值为基本类型&#xff0c;则直接返回值本身&#xff1b;如果值为对象&#xff0c;其看起来大概…

vivado HDL编码技术

HDL编码技术 介绍 硬件描述语言&#xff08;HDL&#xff09;编码技术使您能够&#xff1a; •描述数字逻辑电路中最常见的功能。 •充分利用AMD设备的体系结构功能。 •模板可从AMD Vivado™设计套件集成设计环境中获得&#xff08;侧面&#xff09;。要访问模板&#xff…

机器学习系列——(二十一)神经网络

引言 在当今数字化时代&#xff0c;机器学习技术正日益成为各行各业的核心。而在机器学习领域中&#xff0c;神经网络是一种备受瞩目的模型&#xff0c;因其出色的性能和广泛的应用而备受关注。本文将深入介绍神经网络&#xff0c;探讨其原理、结构以及应用。 一、简介 神经网…

Python socket库 基础概念

socket库是Python中用于网络编程的标准库之一&#xff0c;它提供了创建套接字&#xff08;socket&#xff09;对象、绑定地址和端口、监听连接、接受连接、发送和接收数据等功能。 套接字是网络通信的基础&#xff0c;它允许程序之间进行数据传输和通信。 套接字类型&#xf…

【碎片知识点】安装Linux系统 VMware与kali

天命&#xff1a;VMware就是可以运行操作系统的载体&#xff0c;kali就是Linux的其中一个分支 天命&#xff1a;Linux有两个分支版本&#xff1a;centos与ubuntu&#xff0c;kali底层就是ubuntu&#xff08;所有Linux用起来都差不多&#xff0c;没啥区别&#xff09; 天命&…

CSS之选择器、优先级、继承

1.CSS选择器 常用的选择器 <body><div class"parent"><div id"one" style"background: blue" class"child">1<div class"one_one">11</div><div style"background-color: blueviole…

一个页面需要加载大量的图片,如何提升用户体验?

当网站页面需要加载大量图片时&#xff0c;优化用户体验非常关键&#xff0c;以下是一些方法来提升用户体验&#xff1a; 图片懒加载&#xff08;Lazy Loading&#xff09;&#xff1a;只加载用户可以看到的图片&#xff0c;当用户向下滚动页面时&#xff0c;再加载其他图片。这…

假期2.14

1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08; A &#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i2); 1.2、…

2024LeetCode分类刷题

一、数组 88. 合并两个有序数组 public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 0, p2 0;int[] sorted new int[m n];while (p1 < m || p2 < n) {int current;if (p1 m) {current nums2[p2];} else if (p2 n) {current nums1[p1];} else i…

每日一题——数字翻转

题目; 这道题看似是很简单的回文数 实则就是很简单的回文数 但是需要注意的一点是负数 可以在开头就进行判断&#xff0c;如果N<0的话就令N-N&#xff0c;将所有数都转成正数就好办了 上代码&#xff1a; #include <iostream> #include<string> #include<…