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

article/2025/7/5 22:28:30

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

要求: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')表示无穷大


http://www.hkcw.cn/article/eIeOsgCCjs.shtml

相关文章

6月2日星期一今日早报简报微语报早读

6月2日星期一&#xff0c;农历五月初七&#xff0c;早报#微语早读。 1、郑钦文晋级法网女单八强&#xff0c;刷新生涯法网最佳战绩&#xff1b; 2、中国汽车报&#xff1a;“价格战”是一场无休止的恶性循环&#xff0c;深陷其中者必将皆输&#xff1b; 3、四川成都市崇州市…

启动metastore时报错MetaException(message:Version information not found in metastore

把hdfs清空重新安装了一下&#xff0c;hive的mysql元数据库删除掉之后重建之后一直启动报错 metastore.RetryingHMSHandler (RetryingHMSHandler.java:<init>(83)) - HMSHandler Fatal error: MetaException(message:Version information not found in metastore.) 后来…

一元函数积分

1. 不同名函数积分 2.三角函数有理式

spring-boot接入websocket教程以及常见问题解决

我们使用spring-boot接入websocket有三种方式&#xff1a;使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint&#xff0c;本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…

【音视频】 FFmpeg 解码H265

一、概述 实现了使用FFmpeg读取对应H265文件&#xff0c;并且保存为对应的yuv文件 二、实现流程 读取文件 将H265/H264文件放在build路径下&#xff0c;然后指定输出为yuv格式 在main函数中读取外部参数 if (argc < 2){fprintf(stderr, "Usage: %s <input file&…

URP - 水效果Shader

一、水面颜色 利用屏幕深度纹理和水体面片的深度差来设置水面颜色&#xff0c;形成水面的颜色渐变 float4 frag(Varyings i):SV_Target {//根据深度差设置水面颜色float2 ScreenUV i.positionCS.xy/_ScreenParams.xy; //屏幕UVfloat depthTex SAMPLE_TEXTURE2D(_CameraDe…

Spring之IOC

Spring 一、文档二、依赖注入方式三、注入其他类型3.1 设置null空值:使用null标签3.2 含特殊字符&#xff1a;使用CDATA 四、注入外部bean、内部bean4.1 注入属性中的外部bean4.2 注入属性中的内部bean4.3 注入属性级联赋值 五、注入集合属性5.1 注入集合属性5.2 把集合注入部分…

RAG的ETL Pipeline源码解读

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL源码解读 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

github 2FA双重认证丢失解决

文章目录 前言一. 凭借ssh 解锁步骤1.1 要求输入设备码1.2.进入二重验证界面1.3.开始2FA恢复1.4.选择使用ssh验证 二.预防措施2.1 云盘上传git_recover_codes.txt2.2 开启多源FA认证2.2.1 大陆无法使用手机验证码 三.参考资料 前言 场景&#xff1a;没有意识到github recovery …

【Java EE初阶 --- 多线程(初阶)】多线程的实现案例

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言单例模式实现单例模式…

BiliNote部署实践

​ 开源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速开始 1. 克隆仓库 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 启动后端&#xff08;FastAPI&#xff09; cd backend pip insta…

基于回归算法的心理健康预测(EDA + 预测)

心理健康涵盖情感、心理与社会福祉&#xff0c;影响认知、情绪和行为模式&#xff0c;决定压力应对、人际交往及健康决策&#xff0c;且在生命各阶段&#xff08;从童年至成年&#xff09;均至关重要。心理健康与身体健康同为整体健康的核心要素&#xff1a;抑郁会增加糖尿病、…

无他相机:专业摄影,触手可及

在数字摄影时代&#xff0c;手机摄影已成为许多人记录生活、表达创意的重要方式。无他相机正是这样一款专为摄影爱好者设计的相机应用程序&#xff0c;它不仅提供了专业级摄影设备的大部分功能&#xff0c;还通过简洁直观的操作界面&#xff0c;让每一位用户都能轻松上手&#…

Qt/C++编写GB28181服务端工具/绿色版开箱即用/对标wvp-gb28181/实时画面预览/录像回放下载

一、前言说明 使用过不少的gb28181服务端工具&#xff0c;绝大部分都是BS结构的&#xff0c;也就是直接在网页上运行&#xff0c;比如easynvr、liveqing等&#xff0c;也有个知名的开源国标项目叫wvp&#xff0c;总体感觉性能都不如意&#xff0c;理论上来说肯定不如直接CS结构…

ProxyPin抓APK数据包

ProxyPin抓APK数据包&#xff1a; 下载地址&#xff1a;https://github.com/wanghongenpin/proxypin 环境配置&#xff1a; 夜神模拟器&#xff0c;开心消消乐&#xff0c;ProxyPin.apk&#xff0c;ProxyPin.exe 使用步骤&#xff1a; ProxyPin.apk安装https证书&#xff0…

空间智能重塑未来治理

当上海复兴岛的战略空间更新与科创策源功能在时空创新实验基地实现耦合共生&#xff0c;当武汉马拉松的智慧安防系统通过"实景三维城市智眼"构筑起全域智能防线&#xff0c;我们正见证着空间智能技术重构城市治理范式的革命性变革。这场以数据为血脉、算法为神经、模…

FastAPI安全认证:从密码到令牌的魔法之旅

title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdragon excerpt: 在FastAPI中实现OAuth2密码流程的认证机制。通过创建令牌端点,用户可以使用用户名和密码获取JWT访问令牌。代码示例展示了如何使用Cry…

Java Script函数

1.认识JS函数 1.1程序中的foo、bar、baz 在学习编程中&#xff0c;你可能会经常看到foo、bar、baz这些名词 它们通常被用来作为函数、变量、文件的名称 目前已经编程了计算机编程的术语一部分 但是它们本身并没有特别的用途和意义 常常被称之为“伪变量”&#xff08;metasynt…

吴恩达MCP课程(5):mcp_chatbot_prompt_resource.py

前提条件&#xff1a; 1、吴恩达MCP课程&#xff08;5&#xff09;&#xff1a;research_server_prompt_resource.py 2、server_config_prompt_resource.json文件 {"mcpServers": {"filesystem": {"command": "npx","args"…

性能测试的概念和场景设计

一、什么是性能 性能的定义&#xff1a;性能是指系统或设备在执行特定任务时的时间效率和资源利用情况。可以从两个主要维度来理解&#xff1a; 时间维度&#xff1a; a、响应时间&#xff1a;指系统从接收用户请求到返回结果所需的时间。 b、吞吐量&#xff1a;指单位时间内…