当前位置: 首页 > article >正文

【算法设计与分析】实验——二维0-1背包问题(算法分析题:算法思路),独立任务最优调度问题(算法实现题:实验过程,描述,小结)

说明:博主是大学生,有一门课是算法设计与分析,这是博主记录课程实验报告的内容,题目是老师给的,其他内容和代码均为原创,可以参考学习,转载和搬运需评论吱声并注明出处哦。

要求:3-1为算法分析题,写出主要的算法即可。3-2为算法实现题,要求写出:实验名称、实验过程描述(包括程序代码、测试用例、实验结果分析)、实验小结(包括实验过程中遇到的问题及体会)。

算法分析题3-1 二维0-1背包问题

给定n种物品和一背包。物品i的重量是wi ,体积是bi,其价值为vi,背包的容量为c,容积为d。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只能有两种选择,即装入背包和不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。尝试设计一个解决此问题的动态规划算法,并分析算法的时间复杂性。

主要算法思路:

设计一个三位数组dp,存放的值dp[i][j][k]代表前i个物品已经安排好,背包重量为j,体积为k时已经放入的物品的总价值。初始值dp[0][j][k]为0;对于每个物品,有两种选择,选和不选,首先判断是否能放下背包中,如果能,判断放入后,减去重量和体积,加上价值,是否比当前价值大,如果大的话加入,小的话不加入。

时间复杂性分析:

算法实现利用了三层循环,时间复杂性为O(n*c*d).

# a存放所有物品信息(二维列表a[价值][重量][体积]),c背包容量,d容积,dp动态规划数组
def value_max(a, c, d):n = len(a)dp = [[[0 for _ in range(d + 1)] for _ in range(c + 1)] for _ in range(n + 1)]for i in range(1, n+1):  # 遍历每个物品for j in range(c + 1):  # 遍历所有可能的重量for k in range(d + 1):  # 遍历所有可能的体积if j >= a[i-1][1] and k >= a[i-1][2]:dp[i][j][k] = max(dp[i - 1][j][k],  # 不装入dp[i - 1][j - a[i-1][1]][k - a[i-1][2]] + a[i-1][0]  # 装入)else:dp[i][j][k] = dp[i - 1][j][k]return dp[n][c][d]  # 最大价值

算法实现题3-2 独立任务最优调度问题

问题描述:

用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>=bi,而对于某些j, j≠i,有aj<bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。
设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。
研究一个实例: (a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。 对于给定的2台处理机A 和B处理n 个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。

编程任务:

对于给定的2台处理机A B处理n 个作业,找出一个最优调度方案,使2台机器处理

完这n 个作业的时间最短。

数据输入:

由文件input.txt提供输入数据。文件的第1行是1个正整数n, 表示要处理n个作业。接下来的2行中,每行有n 个正整数,分别表示处理机A 和B 处理第i 个作业需要的处理时间。

结果输出:

程序运行结束时,将计算出的最短处理时间输出到文件output.txt 中。

实验名称

独立任务最优调度问题

实验过程描述

程序代码

# 共有n个作业,a,b是机器处理作业需要时间的列表
# dp[i][j]表示处理前i个作业,机器A花费时间为j时,机器B的最小处理时间
def schedule(n, a, b):sum_a = sum(a)dp = [[float('inf')] * (sum_a + 1) for _ in range(n + 1)]dp[0][0] = 0for i in range(1, n + 1):for j in range(sum_a + 1):if j >= a[i - 1] and dp[i - 1][j - a[i - 1]] != float('inf'):dp[i][j] = dp[i - 1][j - a[i - 1]]  # A处理iif dp[i - 1][j] != float('inf'):dp[i][j] = min(dp[i][j], dp[i - 1][j] + b[i - 1])  # B处理imin_time = float('inf')# 所有可能的j中,max(j, dp[n][j])的最小值for j in range(sum_a + 1):if dp[n][j] != float('inf'):min_time = min(min_time, max(j, dp[n][j]))return min_time# 主程序
with open('input.txt', 'r') as f:n = int(f.readline())a = list(map(int, f.readline().split()))b = list(map(int, f.readline().split()))
result = schedule(n, a, b)
with open('output.txt', 'w') as f:f.write(str(result))
print("最短处理时间:", result)

测试用例

实验结果分析

本次实验实现了独立任务最优调度问题,两次测试用例分别对应的结果为49和192。

主要算法思路:

用动态规划设置一个dp数组,表示处理前i个作业,机器A花费时间为j时,机器B的最小处理时间(A,B也可以换顺序),然后下标从小到大遍历dp数组,对于每一个作业,有两种选择,a处理或者b处理,比较两者时间大小,选取花费时间较小的即可。而最终的结果,是对于所有a可能的处理时间中,也就是所有可能的j中,max(j, dp[n][j])的最小值。

时间复杂度分析:

双层循环,外层循环n次,内层循环sum_a+1次,所以时间复杂度为O(n*sum_a)

实验小结

问题

这道题在算法思路方面并没有特别大的问题,主要问题在于编写代码的过程中,如何去初始化dp数组,也就是语句

dp = [[float('inf')] * (sum_a + 1) for _ in range(n + 1)]
dp[0][0] = 0

首先考虑到dp数组一维大小要定义为机器A处理时间的最大值,也就是最坏情况当所有作业都由A来处理时;而数组的二维大小就是作业的总个数,这里的细节是遍历时要从1开始遍历,不然会出现数组下标错误。

体会

实践实现了动态规划算法的应用,主要语法学习点为使用float('inf')表示无穷大

相关文章:

【算法设计与分析】实验——二维0-1背包问题(算法分析题:算法思路),独立任务最优调度问题(算法实现题:实验过程,描述,小结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 要求&#xff1a;3-…...

P12592题解

题目传送门 思路 由于题目中说了可以任意交换两个字符的位置&#xff0c;我们只需要判断这个字符串是否满足回文串的条件即可。 代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[30]; int main(){int T;cin>>T;while(T--){fill(a,a29,0);/…...

ffmpeg命令(二):分解与复用命令

分解&#xff08;Demuxing&#xff09; 提取视频流&#xff08;不含音频&#xff09; ffmpeg -i input.mp4 -an -vcodec copy video.h264-an&#xff1a;去掉音频 -vcodec copy&#xff1a;拷贝视频码流&#xff0c;不重新编码 提取音频流&#xff08;不含视频&#xff09…...

【Git】View Submitted Updates——diff、show、log

在 Git 中查看更新的内容&#xff08;即工作区、暂存区或提交之间的差异&#xff09;是日常开发中的常见操作。以下是常用的命令和场景说明&#xff1a; 文章目录 1、查看工作区与暂存区的差异2、查看提交历史中的差异3、查看工作区与最新提交的差异4、查看两个提交之间的差异5…...

deepseek原理和项目实战笔记2 -- deepseek核心架构

混合专家&#xff08;MoE&#xff09; ​​混合专家&#xff08;Mixture of Experts, MoE&#xff09;​​ 是一种机器学习模型架构&#xff0c;其核心思想是通过组合多个“专家”子模型&#xff08;通常为小型神经网络&#xff09;来处理不同输入&#xff0c;从而提高模型的容…...

在 MATLAB 2015a 中如何调用 Python

在 MATLAB 2015a 中调用 Python 可通过系统命令调用、.NET 交互层包装、MEX 接口间接桥接、环境变量配置四种方式&#xff0c;但因该版本对 Python 支持有限&#xff0c;主要依赖的是系统命令调用与间接脚本交互。其中&#xff0c;通过 system() 函数调用 Python 脚本是最简单且…...

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块

房屋租赁系统 JavaVue.jsSpringBoot&#xff0c;包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/1KmwOFzN9qogyaLQei3b6qw 密码&#xff1a;l2yn 摘 要 社会的发展和科学技术的进步&#xf…...

华为OD机试真题——生成哈夫曼树(2025B卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…...

react与vue的渲染原理

vue&#xff1a;响应式驱动模板编译 &#xff08;1&#xff09;模板编译 将模板&#xff08;.vue 文件或 HTML 模板&#xff09;编译为 渲染函数&#xff08;Render Function&#xff09;&#xff1b; &#xff08;2&#xff09;响应式依赖收集 初始化时&#xff0c;通过 Ob…...

我提出结构学习的思路,意图用结构学习代替机器学习

我提出结构学习的思路&#xff0c;意图用结构学习代替机器学习 1.机器学习的本质和缺点 机器学习的规律是设计算法、用数据训练算法、让算法学会产生正确的数据回答问题&#xff0c;其缺点在于&#xff0c;需要大规模训练数据和巨大算力还其次&#xff0c;机器学习不能产生智…...

Outbox模式:确保微服务间数据可靠交换的设计方案

https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ Outbox模式是一种在微服务架构中确保数据更改和消息/事件发布之间可靠性的设计模式。它解决了在更新数据库和发送消息这两个独立操作中可能出现的不一致问题&#xff08;…...

数据可视化的定义和类型

数据可视化是一种将数据转换为图形或视觉表示的方法。想象一下&#xff0c;你面前有一堆数字和表格&#xff0c;看着这些&#xff0c;可能会让人头大。数据可视化就像是给这些枯燥的数字画上一幅画。它用图表、地图和各种有趣的图形&#xff0c;帮我们把难懂的数字变得容易看懂…...

sqlite-vec:谁说SQLite不是向量数据库?

sqlite-vec 是一个 SQLite 向量搜索插件&#xff0c;具有以零依赖、轻量级、跨平台和高效 KNN 搜索等优势&#xff0c;是本地化向量检索&#xff08;例如 RAG&#xff09;、轻量级 AI 应用以及边缘计算等场景的理想工具。 sqlite-vec 使用纯 C 语言实现&#xff0c;零外部依赖…...

Redis最佳实践——性能优化技巧之监控与告警详解

Redis 在电商应用的性能优化技巧之监控与告警全面详解 一、监控体系构建 1. 核心监控指标矩阵 指标类别关键指标计算方式/说明健康阈值&#xff08;参考值&#xff09;内存相关used_memoryINFO Memory 获取不超过 maxmemory 的 80%mem_fragmentation_ratio内存碎片率 used_m…...

R3GAN训练自己的数据集

简介 简介&#xff1a;这篇论文挑战了"GANs难以训练"的广泛观点&#xff0c;通过提出一个更稳定的损失函数和现代化的网络架构&#xff0c;构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计&#xff0c;GANs可以稳定训练并达到优异…...

MATLAB实战:Arduino硬件交互项目方案

以下是一个使用MATLAB与Arduino进行硬件交互的项目方案&#xff0c;涵盖传感器数据采集和执行器控制。本方案使用MATLAB的Arduino硬件支持包&#xff0c;无需额外编写Arduino固件。 系统组成 硬件&#xff1a; Arduino Uno 温度传感器&#xff08;如LM35&#xff09; 光敏电…...

bert扩充或者缩小词表

在BERT模型中添加自己的词汇&#xff08;pytorch版&#xff09; - 知乎 输入 1. 扩充词表 替换bert词表中的【unused】 2. 缩小词表 因为要使用预训练的模型&#xff0c;词id不能变&#xff0c;词向量矩阵大小不变 要做的是将减少的那一部分词全部对应为unk&#xff0c;即可…...

什么是 TOML?

&#x1f6e0; Rust 配置文件实战&#xff1a;TOML 语法详解与结构体映射&#xff08; 在 Rust 中&#xff0c;Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项&#xff0c;还使用了一种轻巧易读的配置语言&#xff1a;TOML。 本文将深入解析 TOML 的语法…...

git怎么合并两个分支

git怎么合并分支代码 注意: 第一步你得把当前分支合到远程分支去才能有下面的操作 另外我是将develop分支代码合并到release分支去 git 命令 查看本地所有分支 git branch切换分支 例如切换到release分支 git checkout release拉取代码 git pull up release 合并分支 …...

1.文件操作相关的库

一、filesystem(C17) 和 fstream 1.std::filesystem::path - cppreference.cn - C参考手册 std::filesystem::path 表示路径 构造函数&#xff1a; path( string_type&& source, format fmt auto_format ); 可以用string进行构造&#xff0c;也可以用string进行隐式类…...

Pytorch中一些重要的经典操作和简单讲解

Pytorch中一些重要的经典操作和简单讲解&#xff1a; 形状变换操作 reshape() / view() import torchx torch.randn(2, 3, 4) print(f"原始形状: {x.shape}")# reshape可以处理非连续张量 y x.reshape(6, 4) print(f"reshape后: {y.shape}")# view要求…...

【容器docker】启动容器kibana报错:“message“:“Error: Cannot find module ‘./logs‘

说明&#xff1a; 1、服务器数据盘挂了&#xff0c;然后将以前的数据用rsync拷贝过去&#xff0c;启动容器kibana服务&#xff0c;报错信息如下图所示&#xff1a; 2、可能是拷贝docker文件夹&#xff0c;有些文件没有拷贝过去&#xff0c;导致无论是给文件夹授权用户kibana或者…...

基于bp神经网络的adp算法

基于BP神经网络的ADP&#xff08;自适应动态规划&#xff09;小程序的MATLAB实现示例。这个小程序包含Actor网络和Critic网络&#xff0c;用于解决优化问题。 MATLAB代码示例 % 基于BP神经网络的ADP小程序 % 包含Actor网络和Critic网络% 定义网络结构 inputSize 2; % 输入层…...

C#里与嵌入式系统W5500网络通讯(4)

怎么样修改W5500里的socket收发缓冲区呢? 需要进行下面的工作,首先要了解socket缓冲区的作用,接着了解缓冲区的硬件资源, 最后就是要了解自己的需求,比如自己需要哪个socket的收发送缓冲区多大。 硬件的寄存器为: 这是 W5500 数据手册中关于 Sn_RXBUF_SIZE(Socket n …...

Spring boot集成milvus(spring ai)

服务器部署Milvus Run Milvus with Docker Compose (Linux) milvus版本可在docker-compose.yml中进行image修改 启动后&#xff0c;docker查看启动成功 spring boot集成milvus 参考了这篇文章 Spring AI开发RAG示例&#xff0c;理解RAG执行原理 但集成过程中遇到了一系列…...

Visual Studio+SQL Server数据挖掘

这里写自定义目录标题 工具准备安装Visual studio 2017安装SQL Server安装SQL Server Management Studio安装analysis service SSMS连接sql serverVisual studio新建项目数据源数据源视图挖掘结构部署模型设置挖掘预测 部署易错点 工具准备 Visual studio 2017 analysis servi…...

maven项目编译时复制xml到classes目录方案

maven项目编译时复制xml到classes目录方案 <resources><resource><!-- xml放在java目录下 --><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources…...

通过阿里云服务发送邮件

通过阿里云服务发送邮件 1. 整体描述2. 方案选择2.1 控制台发送2.2 API接口接入2.3 SMTP接口接入2.4 结论 3. 前期工作3.1 准备工作3.2 配置工作3.3 总结 4. 收费模式4.1 免费额度4.2 资源包4.3 按量付费 5. Demo开发5.1 选择SMTP服务器5.2 pom引用5.3 demo代码5.4 运行结果 6 …...

Vad-R1:通过从感知到认知的思维链进行视频异常推理

文章目录 速览摘要1 引言2 相关工作视频异常检测与数据集视频多模态大语言模型具备推理能力的多模态大语言模型 3 方法&#xff1a;Vad-R13.1 从感知到认知的思维链&#xff08;Perception-to-Cognition Chain-of-Thought&#xff09;3.2 数据集&#xff1a;Vad-Reasoning3.3 A…...

黑马Java面试笔记之MySQL篇(事务)

一. 事务的特性 事务的特性是什么&#xff1f;可以详细说一下吗&#xff1f; 事务是一组操作的集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失…...