【算法设计与分析】实验5:贪心算法—装载及背包问题

server/2025/2/1 21:40:01/

目录

一、实验目的

二、实验环境

三、实验内容

四、核心代码

五、记录与处理

六、思考与总结

七、完整报告和成果文件提取链接

一、实验目的

        掌握贪心算法求解问题的思想;针对不同问题,会利用贪心算法进行问题建模、求解以及时间复杂度分析;并利用JAVA/C/C++等编程语言开展算法编码实践(语言自选)。

        理解装载问题及背包问题的贪心求解策略;对比分析与动态规划求解问题的算法异同;能够利用贪心算法,开展装载问题及背包问题的算法设计及编码实现。

二、实验环境

        1、机房电脑  Window11

        2、Eclipse/Dev-C++等

三、实验内容

实验要求及原理:

掌握贪心算法求解问题的策略及思路;

能够用贪心算法解决的问题一般都具有两个重要性质:贪心选择性质和最优子结构性质

1.贪心选择性质

贪心算法求解的问题的整体最优解可以通过一系列局部最优选择来达到,贪心算法不依赖将来所做的选择,也不依赖子问题的解,所以贪心算法一般是自顶向下解决问题。

2.最优子结构性质

当一个问题的最优解包含其子问题的最优解时,则此问题具有最优子结构性质。动态规划算法和贪心算法求解的问题都具有最优子结构性质

基于贪心算法设计装载问题的求解;

针对指定容量C的船,给定n个集装箱,各集装箱重量为wi。如何将集装箱装到船上保证装的集装个数最多?针对装载问题,如何利用贪心算法进行算法设计及优化。

问题分析:

wi越小可装载的集装箱个数越多,所以采用优先选取重量轻的集装箱装船的贪心思路;将集装箱重量从小到大排列,重量最轻的先装,将尽可能多的集装箱装到船上,每一次选择重量最轻的,这样就保证了最终问题的解是最优解。

在装载算法中,由于排序步骤是主导因素,因此采用最优的排序算法时,时间复杂度为O(nlog n)

基于贪心算法设计背包问题的求解;

针对指定容量C的背包,给定n个物品,各物品具有重量wi、价值vi。如何选择物品装入背包,使得价值最大(未要求0/1性)?背包问题,贪心算法设计求解策略及优化。

问题分析:

首先计算每种物品的单位重量的价值:vi/wi,然后根据贪心选择策略将尽可能多的单位重量价值最高的物品放入背包。若将这种物品全部放入背包后,背包内总重量还未超过c,就选择单位重量价值次高的物品并尽可能多的装入背包,以此类推不断进行下去直到背包装满

动态规划求解0/1背包问题的思路差异:

对于0/1背包问题,贪心算法得到的不是全局最优解,0/1背包只能用动态规划算法来解决,因为该问题具有约束条件和目标函数的特性,而动态规划可以通过记录子问题的解来避免重复计算,并逐步构建出全局最优解,系统地考虑所有可能的解和约束条件,能够找到全局最优解。

在设计背包问题中,我使用了快速排序算法进行排序,使用了最快速的排序算法,该算法的时间复杂度最优,也为O(nlogn)

对上述算法进行时间复杂性分析,并输出程序运行时间及运行结果。

算法的时间复杂度为O(nlog n)。

四、核心代码

void loading(float C, float w[], int x[], int n) {// 创建一个数组来存储重量和原始索引的配对// 将每个物品的重量和索引组成一个pair,存入items数组pair<float, int> items[n];for (int i = 0; i < n; i++) {items[i] = make_pair(w[i], i); }// 按照重量进行排序sort(items, items + n, compare); // 初始化x数组为0 for (int i = 0; i < n; i++) {x[i] = 0;}// 装载集装箱for (int i = 0; i < n && items[i].first <= C; i++) {x[items[i].second] = 1; // 标识为1,表示商品要取C -= items[i].first;    // 调整更新货船容量}
}
// 快速排序函数,递归地对数组进行排序
void quickSort(float arr[], float w[], float v[], int low, int high) {if (low < high) {// pi是分区索引,arr[pi]现在在正确的位置int pi = partition(arr, w, v, low, high);// 分别对分区前后的元素进行排序quickSort(arr, w, v, low, pi - 1);quickSort(arr, w, v, pi + 1, high);}
}// 根据单位重量价值对物品进行排序
void Sort(int n, float w[], float v[]) {for (int i = 0; i < n; i++)z[i] = v[i] / w[i]; // 用z[]存物品的单位重量价值quickSort(z, w, v, 0, n - 1); // 调用快速排序函数进行排序
}

五、记录与处理

1.基于贪心算法设计装载问题的求解:

2.基于贪心算法设计背包问题的求解:

六、思考与总结

贪心算法是一种逐步构建解决方案的算法策略,贪心算法通过一系列局部最优选择来构建全局最优解,其关键在于每一步选择都是当前状态下的最佳决策,是自顶向下的策略动态规划算法一般是自底向上解决问题。贪心具有两个性质:贪心选择性质和最优子结构性质

七、完整报告和成果文件提取链接

完整可运行代码以及相关实验报告以下链接可获取:
链接: https://pan.baidu.com/s/1iss6-C2nxZQGkEpo-WDn0A?pwd=g5cg 提取码: g5cg 


http://www.ppmy.cn/server/164173.html

相关文章

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…

使用 PyTorch 实现线性回归:从零开始的完整指南

在机器学习中&#xff0c;线性回归是最基础且广泛使用的算法之一。它通过拟合数据点之间的线性关系&#xff0c;帮助我们理解和预测变量之间的关系。本文将通过一个简单的例子&#xff0c;展示如何使用 PyTorch 框架实现线性回归&#xff0c;并对自定义数据集进行拟合。 1. 线…

【漫话机器学习系列】066.贪心算法(Greedy Algorithms)

贪心算法&#xff08;Greedy Algorithms&#xff09; 贪心算法是一种逐步构建解决方案的算法&#xff0c;每一步都选择当前状态下最优的局部选项&#xff08;即“贪心选择”&#xff09;&#xff0c;以期望最终获得全局最优解。贪心算法常用于解决最优化问题。 核心思想 贪心选…

Unity游戏(Assault空对地打击)开发(2) 基础场景布置

目录 导入插件 文件夹整理 场景布置 山地场景 导入插件 打开【My Assets】&#xff08;如果你刚进行上篇的操作&#xff0c;该窗口默认已经打开了&#xff09;。 找到添加的几个插件&#xff0c;点击Download并Import x.x to...。 文件夹整理 我们的目录下多了两个文件夹&a…

Kotlin 2.1.0 入门教程(九)

类型检查和转换 在 Kotlin 中&#xff0c;可以执行类型检查以在运行时检查对象的类型。类型转换能够将对象转换为不同的类型。 is 和 !is 操作符 要执行运行时检查以确定对象是否符合给定类型&#xff0c;请使用 is 操作符或其否定形式 !is。 if (obj is String) {print(ob…

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…

提示词工程

1、什么构成了一个好的提示 提示&#xff1a;输入给AI的问题或指令 好的提示能极大地提高AI的理解和执行的效率&#xff0c;让AI提供更准确和有用的回答。 提示工程&#xff08;Prompt Engineering&#xff09;&#xff1a;研究如何写出好的提示 提示工程原则&#xff1a; …

阿里云域名备案

一、下载阿里云App 手机应用商店搜索"阿里云",点击安装。 二、登录阿里云账号 三、打开"ICP备案" 点击"运维"页面的"ICP备案"。 四、点击"新增网站/App" 若无备案信息,则先新增备案信息。 五、开始备案