算法设计与分析(5题Python版)

1、阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币,第i堆金币的总重量和总价值分别是m,v。阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的金币都装进去。
他想装走尽可能多价值的金币,所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
(1)请给出存储已知数据的数据结构〈2分)
(2)请给出你选择的算法策略(2分)
(3)请写出算法步骤〈任选一种自然语言·伪代码﹑程序进行描逑〉(6分)
(4)假设背包里有4个物品,请自行设计一个算法,并给出输出结果〈物品的重量﹑价值、背包容量自拟)

例题分析:

根据题意可以知道这是一个分数背包问题(金币重量价值比可知)。就是说在背包容量一定的情况下,每个物品可以选择放入部分或全部,要求放入背包中的物品的总价值最大化或者总重量最小化。(01背包不可以使用贪心策略,但是分数背包却是不二之选)

那么,这一题求的是在背包为T的情况下,能拿走最多的金币是多少。

数据结构:我们可以使用列表嵌套映射来存储每堆金币的重量和价值。

coins = [{"w": m1, "v": v1},{"w": m2, "v": v2},...{"w": mN, "v": vN}
]

算法策略计算每堆金币的单位价值,即价值/重量。按单位价值(v/w)从高到低对金币堆进行排序。从单位价值最高的金币堆开始,尽可能多地装入背包,直到背包装满或没有金币可装。(贪心策略,只考虑目前的最好选择)

代码实现

class Item:def __init__(self, weight, value):self.weight = weightself.value = valueself.value_per_weight = value / weightdef fractional_knapsack(coins, T):coins.sort(key=lambda x: x.value_per_weight, reverse=True)total_value = 0remaining_capacity = Tfor item in coins:if remaining_capacity == 0:breakif remaining_capacity >= item.weight:total_value += item.valueremaining_capacity -= item.weightelse:total_value += item.value_per_weight * remaining_capacitybreakreturn total_valueif __name__ == "__main__":n, T = map(int, input().split())values = list(map(int, input().split()))weights = list(map(int, input().split()))# python内部的列表生成式coins = [Item(weights[i], values[i]) for i in range(n)]max_value = fractional_knapsack(coins, T)print(f"{max_value:.1f}")
输入:
4 20 
25 24 15 10
18 15 10 4
输出:
35.5
2、游艇俱乐部在长红上设置了n个游艇出租站,游客可以在上游的出租站租用游艇,在下游的任何一个游艇出租站归还游艇。游艇出租站i到出租站j(i<j)之间的租金为r(i,j)。求解从游艇出租站1到游艇出租站n所需的最少的租金?
(1〉写出选用的算法策略(2分)
(2)写出该算法策略的思想(4分)
(3)写出求解问题所用的数据结构(2分)
(4)写出求解问题的算法步骤(5分)
(5)分析算法的时间复杂度和空间复杂度(2分)

例题分析:

n个出租站,游艇i到j的租金为r(i,j),求从1到n所需的最少租金。

租金直接使用二维数组表示(r[i][j])。

那么,我们就可以想到是不是可以用 dp[j] 表示从1到j的最少租金,故所求结果为 dp[n]。

(1)动态规划。

(2)dp[j]=min(dp[j],dp[i]+r[i][j]) (i>j)

(3)列表

(4)初始化dp数组dp[1]=0,其余的dp[i]全部为inf,遍历每一个出租站i,对于每个i再遍历后边的出租站j,更新dp[j]。

(5)时间复杂度:o(n2)空间复杂度:o(n2)

def min_rent(n, r):# float('inf') 正无穷大  float('-inf')dp = [float('inf')] * (n + 1)dp[1] = 0for i in range(1, n):for j in range(i + 1, n + 1):dp[j] = min(dp[j], dp[i] + r[i][j])return dp[n]n = int(input())
r = [[0] * (n + 1) for _ in range(n + 1)]
for i in range(1, n + 1):values = list(map(int, input().split()))for j in range(i + 1, n + 1):r[i][j] = values[j - i - 1]r[j][i] = r[i][j]result = min_rent(n, r)
print(result)
3、三个矩阵大小分别为3*4·4*5·5*6,求其相乘的最优结合次序?
(1)写出所用的求解方法(4分)
(2)描述该方法求解的步骤(4分)
(3)给出求解过程(4分)
(4)给出求解结果(2分)

例题分析:

(1) 求解方法:动态规划

(2) 求解步骤:
   1. 创建一个二维数组 `dp`,其中 `dp[i][j]` 表示从第 `i` 个矩阵到第 `j` 个矩阵相乘所需的最小计算次数。
   2. 初始化 `dp`,将对角线上的元素设为 0,表示单个矩阵相乘的次数为 0。
   3. 使用两重循环遍历所有可能的长度 `len`(从 2 开始到矩阵总数),在每个长度下再使用一个循环遍历所有起始位置 `i`,计算相应的结束位置 `j`。
   4. 对于每个位置 `(i, j)`,遍历中间位置 `k`(从 `i` 到 `j-1`),更新 `dp[i][j]` 的值为 `dp[i][k] + dp[k+1][j] + matrix[i].row * matrix[k].col * matrix[j].col` 的最小值,其中 `matrix[i].row` 表示第 `i` 个矩阵的行数,`matrix[k].col` 表示第 `k` 个矩阵的列数,`matrix[j].col` 表示第 `j` 个矩阵的列数。
   5. 最终 `dp[0][n-1]` 中存储的值即为所有矩阵相乘的最小计算次数。

(3) 求解过程:

def matrix_chain_order(p):n = len(p) - 1m = [[0 for _ in range(n)] for _ in range(n)]s = [[0 for _ in range(n)] for _ in range(n)]for l in range(2, n):for i in range(n - l + 1):j = i + l - 1m[i][j] = float('inf')for k in range(i, j):q = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]if q < m[i][j]:m[i][j] = qs[i][j] = kreturn s
def print_optimal_parens(s, i, j):if i == j:print(f"A{i}", end="")else:print("(", end="")print_optimal_parens(s, i, s[i][j])print_optimal_parens(s, s[i][j] + 1, j)print(")", end="")
def main():p = [3, 4, 5, 6]s = matrix_chain_order(p)print_optimal_parens(s, 0, len(p) - 2)print()
if __name__ == "__main__":main()
4、输入一个无重复字符的字符串s,打印出该字符串中字符的所有排列,请使用回溯法求解该问题。
(1)请定义问题的解空间。(2分)
〔2)写出解空间的组织结构。〔1分)
(3)写出约束条件和限界条件。(2分)
(4)写出该问题的算法步骤。(6分)
〔5)给定‘abc’,请给出算法求解的结果。〔2分)

例题分析:

(1) 解空间:所有无重复字符的字符串的排列。

(2) 解空间的组织结构:使用一个数组 `visited` 记录每个字符是否被访问过,使用一个字符串 `path` 记录当前路径上的字符排列。

(3) 约束条件和限界条件:
   - 约束条件:每个字符只能被使用一次,保证排列的唯一性。
   - 限界条件:当当前路径上的字符数等于输入字符串的长度时,表示已经得到一个完整的排列。

(4) 算法步骤:
   1. 初始化一个长度为字符串长度的 `visited` 数组,全部初始化为 `false`,表示所有字符均未被访问过。
   2. 初始化一个空的字符串 `path`,用于记录当前路径上的字符排列。
   3. 从第一个字符开始,调用回溯函数,遍历所有可能的排列。
   4. 回溯函数的参数包括当前路径 `path`、访问状态数组 `visited`、输入字符串 `s`,以及结果集合 `res`。
   5. 在回溯函数中,遍历字符串 `s` 的每个字符,如果该字符未被访问过,则将其加入到 `path` 中,并将 `visited` 对应位置设为 `true`,然后递归调用回溯函数。
   6. 当 `path` 的长度等于 `s` 的长度时,表示已经得到一个排列,将 `path` 加入到结果集合 `res` 中。
   7. 回溯结束后,返回结果集合 `res`。

(5) 算法求解结果:
 

def backtrack(path, visited, s, res):if len(path) == len(s):res.append(path)returnfor i in range(len(s)):if not visited[i]:visited[i] = Truebacktrack(path + s[i], visited, s, res)visited[i] = Falsedef permutation(s):res = []visited = [False] * len(s)backtrack("", visited, s, res)return ress = "abc"
result = permutation(s)
for perm in result:print(perm)
5、最优装载问题:有n个物品,第i个物品的重量为wi。在不超过最大承载量的范围内,你要选择尽可能多的物品。请问你最多可以选择多少件物品?
(1〉你有几种方法求解该问题,请写出方法名称。(要求至少写出2种)(4分)
(2〉请从你的解决方法中,选择1种方法,设计具体求解步骤。(6分)
(3〉根据你的求解步骤,使用给定的输入样例,写出每个步骤的处理结果。(4分)

例题分析:

可以使用数组存储每一个物品的重量,然后从小到大给数组排个序,循环小于最大承载量,可以累加判断也可以相减判断。

(1)贪心策略、动态规划

(2)贪心策略:每次选择当前最优解。将物品按照重量从小到大排序。从最轻的物品开始依次尝试装载,直到超过最大承载量为止。返回装载的物品数量。

(3)代码:

def load_problem(weights, c):weights.sort()tsum = 0.0temp = 0for weight in weights:tsum += weightif tsum <= c:temp += 1else:breakreturn tempdef main():c, num = map(float, input().split())weights = list(map(float, input().split()))result = load_problem(weights, c)print(result)if __name__ == "__main__":main()
输入:
10 3
1 3 13
输出:
2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云岚到家】-day02-2-客户管理-认证授权

【云岚到家】-day02-2-客户管理-认证授权 第二章 客户管理1 认证模块1.1 需求分析1.2 小程序认证1.2.1 测试小程序认证1.2.1.1 参考官方流程1.2.1.2 申请小程序账号1.2.1.3 创建jzo2o-customer1.2.1.4 部署前端1.2.1.5 编译运行1.2.1.6 真机调试 2 阅读代码2.1 小程序认证流程2…

Qt——升级系列(Level Five):显示类控件、输入类控件、多元素控件、容器类控件、布局管理器

显示类控件 Label QLabel 可以⽤来显⽰⽂本和图⽚. 核⼼属性如下&#xff1a; 属性 说明 text QLabel 中的⽂本 textFormat ⽂本的格式. • Qt::PlainText 纯⽂本 • Qt::RichText 富⽂本(⽀持 html 标签) • Qt::MarkdownText markdown 格式 • Qt::AutoText 根…

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外&#xff0c;还有一些高级配置&#xff0c;如网页的状态&#xff0c;第三方模块需要另外安装&#xff0c;支持变量&#xff0c…

【C语言初阶】循环语句

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;C语言 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、什么是循环语句 二、while语句 while语句中的break和continue break continue 三、for循环 break和continue在for循…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…

C++ - Clion安装Qt msvc2017版本教程,基础环境配置clion+ Qt5.12.12 msvc2017 + VS2019

背景&#xff1a;平时代码开发使用clion&#xff0c;但使用项目要制定mscv2017版本Qt。先装过mingw版本Qt无法运行&#xff0c;但msvc版本依赖装有Visual Studio&#xff0c;本地装的又是2019版。就出现了这个大坑&#xff0c;需要配置好clion Qt msvc2017 VS2019。 文章目录 …

【Git】Windows下使用可视化工具Sourcetree

参考&#xff1a;[最全面] SourceTree使用教程详解(连接远程仓库&#xff0c;克隆&#xff0c;拉取&#xff0c;提交&#xff0c;推送&#xff0c;新建/切换/合并分支&#xff0c;冲突解决&#xff0c;提交PR) 1.Git工具–sourcetree 之前文章介绍过Linux系统中的Git工具&…

Linux - 信号概念 信号产生

Linux - 信号概念 & 信号产生 信号概念信号产生软件信号killraiseabortalarm 硬件信号键盘产生信号硬件中断 信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是一个发送信号的…

爱德华三坐标软件ACdmis.AC-dmis密码注册机

爱德华三坐标软件 AC-DMIS 是一款功能强大的三坐标测量软件&#xff0c;具有以下特点&#xff1a; • 支持多种测量模式&#xff1a;包括接触式测量、非接触式测量、复合式测量等&#xff0c;可以满足不同类型工件的测量需求。 • 高精度测量&#xff1a;采用先进的测量算法和…

助力高考,一组彩色的文字

1、获取文本内容 首先&#xff0c;获取每个<div>元素的文本内容&#xff0c;并清空其内部HTML&#xff08;innerHTML ""&#xff09;。 2、创建<span>元素 然后&#xff0c;它遍历文本的每个字符&#xff0c;为每个字符创建一个新的<span>元素…

通过python操作redis(windows)

注意在连接之前要确保 redis 服务已经安装。 更多的安装信息请查看&#xff1a;https://blog.csdn.net/sinat_20471177/article/details/132042779?spm1001.2014.3001.5501 redis 模块 Python 要使用 redis&#xff0c;需要先安装 redis 模块。如果要做数据导入/导出操作的…

34、matlab输入命令汇总

1、ans:最近计算的答案 代码示例1 12ans 3 代码示例2 Brand(7)B 列 1 至 60.7060 0.3171 0.1869 0.6797 0.5853 0.95930.0318 0.9502 0.4898 0.6551 0.2238 0.54720.2769 0.0344 0.4456 0.1626 0.7513 0.13860.0462 0.4387…

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)

文章目录 一&#xff1a;系统功能&#xff1a;设置成绩&#xff08;添加或修改&#xff09;交互逻辑&#xff1a;涉及页面 Page02.vue&#xff0c;ModalEdit.vue主页面Page.vue注入子页面&#xff0c;使用子页面标签属性主页面对子页面做通信&#xff0c;子页面ModalEdit接收参…

【安装笔记-20240610-Linux-免费域名服务之eu.org】

安装笔记-系列文章目录 安装笔记-20240610-Linux-免费域名服务之eu.org 文章目录 安装笔记-系列文章目录安装笔记-20240610-Linux-免费域名服务之eu.org 前言一、软件介绍名称&#xff1a;eu.org主页官方介绍 二、安装步骤测试版本&#xff1a;openwrt-23.05.3-x86-64注册填写…

基于机器学习和深度学习的NASA涡扇发动机剩余使用寿命预测(C-MAPSS数据集,Python代码,ipynb 文件)

以美国航空航天局提供的航空涡扇发动机退化数据集为研究对象&#xff0c;该数据集包含多台发动机从启动到失效期间多个运行周期的多源传感器时序状态监测数据&#xff0c;它们共同表征了发动机的性能退化情况。为减小计算成本&#xff0c;需要对原始多源传感器监测数据进行数据…

Java——方法详细介绍

一、方法调用机制 1、方法调用机制详细介绍 下面对方法调用在内存中的情况进行分析&#xff0c;以下面的代码为例&#xff1a; public class Test {public static void main(String[] args) {Person person new Person();person.name "张三";person.age 18;int…

【Linux文件篇】优化文件读写,加速数据处理策略——缓冲区

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;我们已经复习了C语言中的接口&#xff0c;并且学习了许多文件系统调用&#xff0c;了解了文件描述符以及重定向。今天我们继续学习文件缓冲区的相关内容。 缓冲区 在学习C语言时&#xff0c;我们经常…

LabVIEW电池测试系统

1. 背景 随着电动汽车、可再生能源等领域的迅速发展&#xff0c;电池作为能源储存和释放的核心组件&#xff0c;其性能评估变得尤为重要。电池的充放电性能、容量、循环寿命等参数直接影响着设备的工作性能和使用寿命。因此&#xff0c;设计一套全面、准确的电池测试系统对于提…

技术前沿 |【大模型BLIP-2的多模态训练】

大模型BLIP-2的多模态训练 一、引言二、BLIP-2模型概述三、多模态训练成本问题四、冻结预训练好的视觉语言模型参数的优势五、冻结预训练好的视觉语言模型参数的方法 一、引言 随着人工智能技术的飞速发展&#xff0c;大型多模态模型如BLIP-2在多个领域取得了显著的成果。然而…

学生信息管理(C语言)

学生信息管理 &#xff08;1&#xff09;问题描述 学生信息包括&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;性别&#xff0c;出生年月&#xff0c;地址&#xff0c;电话&#xff0c;E-mail等。试设计一学生信息管理系统&#xff0c;使之能提供以下功能&am…