算法设计与分析实验报告-贪心算法
校课程的简单实验报告。
算法设计与分析实验报告-递归与分治策略
算法设计与分析实验报告-动态规划算法
算法设计与分析实验报告-贪心算法
dijkstra迪杰斯特拉算法(邻接表法)
算法设计与分析实验报告-回溯法
算法设计与分析实验报告-分支限界法
算法设计与分析实验报告-分治法相关练题
北京大学出版社-算法设计与分析
一、实验目的
1.理解贪心算法的概念;
2.掌握贪心算法的基本要素;
3.掌握设计贪心算法的步骤和策略。
二、实验内容
使用贪心法求解以下问题,要求给出程序代码,并编译运行程序:
1.P118习题2。
2.P118习题5。
三、实验环境
1. 使用的操作系统及版本:
Windows 10
2. 使用的编译系统及版本:
CLion 2022.2.4
四、实验步骤及说明
1、P118习题2
对于用邻接链表表示的有向无环图,设计一个解单起点最短路径问题的线性算法。
dijkstra迪杰斯特拉算法(邻接表法)
代码如下:
//
// Created by GiperHsiue on 2022/11/27.
//
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define INFINE 99999 // 定义最大
// 邻接表
struct ArcNode // 边信息
{int adjvex; //有向边的 目标顶点 下标(从1开始)int weight; //边的权值struct ArcNode *next; //邻接表, 指向下一个邻接边信息
};
struct VertexNode // 顶点
{int vertex; //顶点下标(1 ~)ArcNode *firstedge; // 有向边信息节点指针(源为vertex)
};
struct AdjList // 图
{vector<VertexNode> adjlist; //顶点数组int vexnum; //顶点数 int arcnum; //边数
};
// 图的初始化
void createGraph(AdjList& G){cout << "输入顶点数 边数: " << endl;cin >> G. vexnum >> G. arcnum;// 初始化G的顶点数组for(int i = 0; i <= G. vexnum; i ++){ // 下标从1开始, 所以初始化vexnum + 1个顶点(0无作用)VertexNode* tmp = new VertexNode;tmp->vertex = i, tmp->firstedge = nullptr;G. adjlist. emplace_back(*tmp);}//边信息// n1: 源顶点 n2: 目标顶点 we: 权重(距离)int n1, n2, we;cout << "输入边信息: (a b we): " << endl; // a -> b weight: wefor(int i = 0; i < G. arcnum; i ++){cin >> n1 >> n2 >> we;// 初始化一个边节点, 目标顶点为n2ArcNode* tmp = new ArcNode;tmp->adjvex = n2, tmp->weight = we;// 头插法 将边信息节点插入// 节约时间(尾插要一直遍历到尾部插入)tmp->next = G. adjlist[n1]. firstedge;G. adjlist[n1]. firstedge = tmp;}
}
// 获取两顶点之间权重weight(距离)
int getWeight(AdjList& G, int n1, int n2){if(n1 == n2) return 0;ArcNode* tmp = G. adjlist[n1]. firstedge;while(tmp){if(tmp->adjvex == n2) return tmp->weight;tmp = tmp->next;}// 两点之间没有边, 返回INFINEreturn INFINE;
}
void Dijkstra(AdjList& G, int ear, vector<int>& prev, vector<int>& dist){// 初始化// flag数组记录 某点是否纳入已找到点集合// prev数组记录 前驱顶点下标// dist数组记录 从源顶点ear 到 i顶点的最短路径vector<bool> flag (G. adjlist. size() + 1, false);for(int i = 1; i <= G. vexnum; i ++) dist[i] = getWeight(G, ear, i), prev[i] = ear;flag[ear] = true, prev[ear] = 0;// 开始for(int i = 2; i <= G. vexnum; i ++){int pos = 1; // 未纳入的距离最小的顶点int weiMin = INFINE;for(int j = 1; j <= G. vexnum; j ++){if(!flag[j] && dist[j] < weiMin){weiMin = dist[j], pos = j;}}flag[pos] = true;for(int j = 1; j <= G. vexnum; j ++){if(!flag[j]){ // 未纳入点集中, 找到pos到这些点的距离, 与dist数组比较是否更新int tmpWei = getWeight(G, pos, j);if(tmpWei != INFINE) tmpWei = tmpWei + weiMin; // 两点距离应该为ear -> pos -> jif(tmpWei < dist[j]) {dist[j] = tmpWei; // 距离更小则更新distprev[j] = pos; // 前顶点更新为pos}}}}
}
// 找路径
void pathDist(vector<int>& prev, vector<int>& dist, int ear){// prev数组中为1有2种情况(djikstra初始化过程的时候全赋值为1, 后续一直未改变):// 1: 从ear到 顶点 只有 ear -> 顶点 这一条路最短// 2: 无法从ear到达的顶点for(int i = 1; i <= prev. size() - 1; i ++){stack<int> trace;if(ear == i) continue;cout << ear << " 到 " << i ;// 无连通if(dist[i] == INFINE) {cout << "无连通" << endl;continue;}cout << "最短距离: " << dist[i] << " 最短路径: ";int tmp = i;while(tmp){ // 源顶点prev是0trace. push(tmp);tmp = prev[tmp];}// 开始出栈, 栈顶一定是ear源顶点cout << trace. top();trace. pop();while(!trace. empty()){cout << " -> " << trace. top();trace. pop();}cout << endl;}
}
int main(){AdjList G;createGraph(G);// prev数组记录 前驱顶点下标vector<int> prev (G. vexnum + 1, 0);// dist数组记录 从源顶点ear 到 i顶点的最短路径vector<int> dist (G. vexnum + 1, INFINE);// 从源点ear 出发, 到达其余所有点的最短路径cout << "输入源顶点ear: ";int ear;cin >> ear;Dijkstra(G, ear, prev, dist);pathDist(prev, dist, ear);return 0;
}
测试如下:

- P118习题5 小船过河问题
一群人划船过河,河边只有一条船,这条船可以容纳两个人,船过河后需要一人将船开回,以便所有人都可以过河,每个人过河速度不一样,两个人过河速度取决于慢的那个人,请问最少需要多久让所有人过河?
//
// Created by GiperHsiue on 2022/11/27.
//
// 小船过河问题
#include <iostream>
#include <vector>
using namespace std;
// 归并排序
void mergeSort(vector<int>& num, int l, int r){if(l >= r) return;int mid = l + (r - l) / 2;mergeSort(num, l, mid), mergeSort(num, mid + 1, r);int a = l, b = mid + 1, k = 0;vector<int> tmp (r - l + 1, 0);while(a <= mid && b <= r){if(num[a] <= num[b]) tmp[k++] = num[a++];else tmp[k++] = num[b++];}while(a <= mid) tmp[k++] = num[a++];while (b <= r) tmp[k++] = num[b++];for(int i = 0, j = l; j <= r; i ++, j ++) num[j] = tmp[i];
}
int calTime(vector<int>& num){int cnt = num. size(), res = 0;while(cnt > 3){int tmp1 = num + 2 * num + num[cnt - 1];int tmp2 = 2 * num + num[cnt - 1] + num[cnt - 2];res += min(tmp1, tmp2);cnt -= 2;}if(cnt == 2) res += num;if(cnt == 3) res += num + num + num;return res;
}
int main(){int n;cin >> n;vector<int> people(n, 0);for(auto &x: people) cin >> x;mergeSort(people, 0, n - 1);cout << "过河最少时间: " << calTime(people) << endl;return 0;
}
代码如下:
测试如下:

五、实验小结及思考
通过本次实验对于贪心算法有了进一步的认识与理解,并运用贪心思维解决实际问题,理解贪心算法的概念,掌握贪心算法的基本要素,掌握设计贪心算法的步骤和策略。
相关文章:
算法设计与分析实验报告-贪心算法
校课程的简单实验报告。 算法设计与分析实验报告-递归与分治策略 算法设计与分析实验报告-动态规划算法 算法设计与分析实验报告-贪心算法 dijkstra迪杰斯特拉算法(邻接表法) 算法设计与分析实验报告-回溯法 算法设计与分析实验报告-分支限界法 …...
Unity读取服务器声音文件
Unity读取服务器声音文件 功能1.在网站的根目录放置一个声音文件Alarm01.wav(这个是window系统自带的找不到这个格式的可以直接在C盘搜索)2.在WebManager.cs脚本中添加clipPath、audio、m_downloadClip属性和DownloadSound()函数&…...
掌握ElasticSearch(一):Elasticsearch安装与配置、Kibana安装
文章目录 〇、简介1.Elasticsearch简介2.典型业务场景3.数据采集工具4.名词解释 一、安装1.使用docker(1)创建虚拟网络(2)Elasticsearch安装步骤 2.使用压缩包 二、配置1.目录介绍2.配置文件介绍3.elasticsearch.yml节点配置4.jvm.options堆配置 二、可视化工具Kibana1.介绍2.安…...
《剑指offer》Java版--13.机器人的运动范围(BFS)
剑指offer原题13:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为353…...
基于流程挖掘的保险理赔优化策略实践
引言 在当今日益竞争的商业环境中,保险公司面临着日益增长的业务量和客户期望的挑战。特别是在理赔领域,理赔是保险行业的重要环节,也是保险公司和客户之间最直接的联系点。然而,长周期和繁琐的理赔流程常常给保险公司和投保人带来困扰。因此,如何提供准确且高效的理赔处…...
Docker五 | DockerFile
目录 DockerFile 常用保留字 FROM MAINTAINER RUN EXPOSE WORKDIR USER ENV VOLUME ADD COPY CMD ENTRYPOINT DockerFile案例 前期准备 编写DockerFile文件 运行DockerFile 运行镜像 DockerFile是用来构建Docker镜像的文本文件,是由一条条构建…...
2023年度总结:技术旅程的杨帆远航⛵
文章目录 职业规划与心灵成长 ❤️🔥我的最大收获与成长 💪新年Flag 🚩我的技术发展规划 ⌛对技术行业的深度思考 🤔祝愿 🌇 2023 年对我来说是一个充实而令人难以忘怀的一年。这一年,我在CSDN上发表了 1…...
SpringBoot+AOP+Redis 防止重复请求提交
本文项目基于以下教程的代码版本: https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…...
偷流量、端口占用、网络负载高、socket创建释放异常等Android高阶TCP/IP网络问题定位思路
一,背景 通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题,可以通过使用tcpdump抓tcp/ip报文,来定位。但是tcpdump无进程信息,也没有APK包名信息,无法确认异常的报文来自哪些Apk或者n…...
《人人都能用英语》学习笔记
https://github.com/xiaolai/everyone-can-use-english 核心: 用 What──它究竟是什么?Why──为什么它是那个样子?How──要掌握它、应用它,必须得遵循什么样的步骤? 在运行程序之前,要反复浏览代码&a…...
NFC与ZigBee技术在智慧农业物联网监测系统中的应用
近年来,我国农业物联网技术飞速发展,基于物联网技术的智能农业监测系统有望得到较大规模的推广应用。但传统的物联网农业监测系统其网络结构层次单一,多采用基于有线或无线结构的节点-上位机数据采集模式,节点数据访问模式缺乏灵活…...
k8s-cni网络 10
Flannel vxlan模式跨主机通信原理 在同一个节点上的pod 流量通过cni网桥可以直接进行转发; 在需要跨主机访问时,数据包通过flannel(隧道) 知道另一边的mac地址,就可以拿到另一边的ip地址,然后构建常规的以太网数据包,…...
听GPT 讲Rust源代码--src/tools(27)
File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_to_owned.rs 文件rust/src/tools/clippy/clippy_lints/src/methods/suspicious_to_owned.rs的作用是实施Clippy lint规则,检测产生潜在性能问题的字符转换代码,并给出相关建议。 在Rus…...
经济危机下,我们普通人如何翻身?2024创业新风口,适合普通人的创业项目
明年的商业环境会比今年更残酷,不是贩卖危机。旅游行业还在刺激性消费,再过几个月大家就没钱了,估计慢慢也消停。中小微企业资金链断裂,大部分公司倒闭,大批人失业,所以经济恢复需要一个周期。 30年河东&am…...
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…...
python中基本元素的pop函数
python中基本元素的pop函数 一、列表List二、元组Tuple三、字典dict四、集合set 一、列表List pop() 根据索引删除并返回被删除的元素,索引默认为-1 a [1, 2, 3, 2, 5] b a.pop() # b5,默认返回最后一个值 print(b) b a.pop(2) # b3,返回a[2] pri…...
MPLS动态协议LDP配置示例
一、预习: MPLS是一种根据报文中携带的标签来转发数据的技术,两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息,从而实现标签报文的正确转发。 LSR:Label Switch…...
JS调用栈:为何会栈溢出
JS调用栈:为何会栈溢出 JS调用栈什么是函数调用什么是栈在开发中利用调用栈栈溢出 JS调用栈 JavaScript 经常会出现一个函数中调用另外一个函数的情况,调用栈就是用来管理函数调用关系的一种数据结构,首先你要先弄明白函数调用和栈结构 什么…...
代码随想Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
300.最长递增子序列 这道题目的重点在于动态数组的定义 dp[i]:以nums[i]为结尾的最长递增子序列,因为这样定义可以进行递推; 递推:j从0-i进行对比,如果nums[i]大于nums[j],dp[i]dp[j]1; 初始化…...
使用 pytest 相关特性重构 appium_helloworld
一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...

