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

embedded/2025/2/6 18:52: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/embedded/160103.html

相关文章

MySQL 进阶专题:索引(索引原理/操作/优缺点/B+树)

在数据库的秋招面试中&#xff0c;索引&#xff08;Index&#xff09;是一个经典且高频的题目。索引的作用类似于书中的目录&#x1f4d6;&#xff0c;它能够显著加快数据库查询的速度。本文将深入探讨索引的概念、作用、优缺点以及背后的数据结构&#xff0c;帮助你从原理到应…

「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;将抽象部分与其实现部分分离&#xff0c;使它们可以独立变化。降低代码耦合度&#xff0c;避免类爆炸&#xff0c;提高代码的可扩展性。 结构 1. Implementation&#xff08;实现类…

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…

【前端】【Ts】【知识点总结】TypeScript知识总结

一、总体概述 TypeScript 是 JavaScript 的超集&#xff0c;主要通过静态类型检查和丰富的类型系统来提高代码的健壮性和可维护性。它涵盖了从基础数据类型到高级类型、从函数与对象的类型定义到类、接口、泛型、模块化及装饰器等众多知识点。掌握这些内容有助于编写更清晰、结…

无法连接到远程扩展主机服务器

有一次在VSCode上设置了监听调试&#xff0c;动了launch.json文件&#xff0c;下次再打开VSCode远程连接服务器时打不开文件&#xff0c;报错如下&#xff1a; 无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No s…

Django框架的全面指南:从入门到高级

Django框架的全面指南&#xff1a;从入门到高级 目录 引言Django简介安装与配置创建第一个Django项目Django的MVT架构模型&#xff08;Model&#xff09;视图&#xff08;View&#xff09;模板&#xff08;Template&#xff09;URL路由表单处理用户认证与权限Django Admin高级…

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性&#xff0c;如段落和行相关属性、字体文本属性。最后阐述了盒子模型&#xff0c;如元素隐藏、行内与块元素转换、…

OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化

内容目标 学习如何使用 OpenAI 辅助生成和优化多表 SQL 查询了解如何获取数据库结构信息并与 OpenAI 结合使用 实操步骤 1. 创建 SQLite 数据库示例 创建数据库及表结构&#xff1a; import sqlite3# 连接 SQLite 数据库&#xff08;如果不存在则创建&#xff09; conn sq…