洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 python解析

P1064 [NOIP2006 提高组] 金明的预算方案

时间:2023.11.19
题目地址:[NOIP2006 提高组] 金明的预算方案

题目分析

动态规划的0-1背包,采用动态数组。如果不了解的话,可以先看看这个背包DP。
这个是0-1背包的标准状态转移方程 f [ j ] = m a x ( f [ j − w [ i ] ] + v [ i ] , f [ j ] ) f[j] = max(f[j-w[i]] + v[i], f[j]) f[j]=max(f[jw[i]]+v[i],f[j])。那么就基于对这个方程进行展开。
五种情况:
① 不放。
m a x ( ) max() max()
② 放主物品,不带副品。
f [ j ] = f [ j ] = m a x ( f [ j − m a i n _ a r t [ i ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] , f [ j ] ) f[j] = f[j] = max(f[j-main\_art[i][0]] + main\_art[i][1], f[j]) f[j]=f[j]=max(f[jmain_art[i][0]]+main_art[i][1],f[j])
③ 放主物品,带1副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 1 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 1 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][1][0]] + main\_art[i][1] + ral\_art[i][1][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][1][0]]+main_art[i][1]+ral_art[i][1][1])
④ 放主物品,带2副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 2 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 2 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][2][0]] + main\_art[i][1] + ral\_art[i][2][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][2][0]]+main_art[i][1]+ral_art[i][2][1])
⑤ 放主物品,带1、2副品。
f [ j ] = m a x ( f [ j ] , f [ j − m a i n _ a r t [ i ] [ 0 ] − r a l _ a r t [ i ] [ 1 ] [ 0 ] − r a l _ a r t [ i ] [ 2 ] [ 0 ] ] + m a i n _ a r t [ i ] [ 1 ] + r a l _ a r t [ i ] [ 1 ] [ 1 ] + r a l _ a r t [ i ] [ 2 ] [ 1 ] ) f[j] = max(f[j], f[j-main\_art[i][0]-ral\_art[i][1][0]-ral\_art[i][2][0]] + main\_art[i][1] + ral\_art[i][1][1] + ral\_art[i][2][1]) f[j]=max(f[j],f[jmain_art[i][0]ral_art[i][1][0]ral_art[i][2][0]]+main_art[i][1]+ral_art[i][1][1]+ral_art[i][2][1])
这些理解清楚了就简单了。
但是超时了三个,enmm…,有点那啥,主要是理解思路和过程,掌握方法好吧。
1

代码

n, m = map(int, input().split())
main_art = [[] for _ in range(m+1)]
ral_art = [[0, [0]*2, [0]*2] for _ in range(m+1)] 
# 例:[[0, [0, 0], [0, 0]], [1, [300, 600], [0,0]], [2, [200, 400], [100, 400]]]
for i in range(1, m+1):v, p, q = map(int, input().split())if q == 0:main_art[i] = [v, p*v]else:ral_art[q][0] += 1ral_art[q][ral_art[q][0]][0] = vral_art[q][ral_art[q][0]][1] = v*pf = [0]*(n+1)
for i in range(1, m+1):if not main_art[i]:continuefor j in range(n, main_art[i][0]-1, -1):f[j] = max(f[j-main_art[i][0]] + main_art[i][1], f[j])if j >= main_art[i][0] + ral_art[i][1][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][1][0]] + main_art[i][1] + ral_art[i][1][1])if j >= main_art[i][0] + ral_art[i][2][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][2][0]] + main_art[i][1] + ral_art[i][2][1])if j >= main_art[i][0] + ral_art[i][1][0] + ral_art[i][2][0]: # 判断剩余钱(空间)能否买(放)这个物品。f[j] = max(f[j], f[j-main_art[i][0]-ral_art[i][1][0]-ral_art[i][2][0]] + main_art[i][1] + ral_art[i][1][1] + ral_art[i][2][1])
print(f[n])

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

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

相关文章

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法,通过引入故障来找到系统的bug,验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

大模型的交互能力

摘要: 基础大模型显示出明显的潜力,可以改变AI系统的开发人员和用户体验:基础模型降低了原型设计和构建AI应用程序的难度阈值,因为它们在适应方面的样本效率,并提高了新用户交互的上限,因为它们的多模式和生…

RobotFramework之用例执行时添加命令行参数(十三)

学习目录 引言 标签tag 设置变量 随机执行顺序 设置监听器 输出日志目录和文件 引言 Robot Framework 提供了许多命令行选项,可用于控制测试用例的执行方式以及生成的输出。本节介绍一些常用的选项语法。 标签tag 之前文章我们介绍过,在测试套件…

浅谈滑动窗口

滑动窗口是什么? 滑动窗口其实是一个想象出来的数据结构。有左边界L和有边界R。 举例来说:数组 arr {3,1,5,7,6,5,8}; 其窗口就是我们规定的一个运动轨迹。 最开始时,边界LR都在数组的最左侧,此时没有包住任何数。 此时规定&…

线性变换概论

线性变换 定义 设 V V V 和 W W W 都是在域 K K K上定义的向量空间, T : V → W T :V \rightarrow W T:V→W 对任二向量 x , y ∈ V x,y \in V x,y∈V,与任何标量 a ∈ K a \in K a∈K,满足: T ( x y ) T ( x ) T ( y ) T(xy)T(x)T(…

Windows 的 WSL 中运行 EasyConnect

Windows 的 WSL 中运行 EasyConnect docker-easyconnect 安装 Docker Desktop 通过 Docker 的官网 Docker Desktop 下载并安装. 安装过程一直下一步即可, 默认推荐 WSL 模式 初始化过程需要梯子 安装完后在搜索框搜索 docker-easyconnect hagb/docker-easyconnect 就是需要…

Spring Boot中使用Redis进行大数据缓存

Spring Boot中使用Redis进行大数据缓存 在Spring Boot中使用Redis进行大数据缓存是一种常见的做法,因为Redis是一种高性能的内存数据库,适用于缓存大量数据。以下是说明和示例代码,演示如何在Spring Boot项目中使用Redis进行大数据缓存。 步…

【Spring总结】注解开发

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步:在需要定义的类上写上注解Component第二步:在Spring Config中定义扫描包第三步:主方法…

在线ws/wss调试工具

具体前往:在线webSocket(ws)调试工具

项目点使用Redis作为缓存技术-自用

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用EnableCaching开启缓存支持即可。 例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。 描述 使用Redis缓存高频数…

图书管理系统 保姆级教学 手把手教你图书管理系统设计!

天梯无捷径,唯有苦攀登。 一起加油,小伙伴们!! 目录 1. 实现思路: 2. 那么如何找对象呢? 3. Book类的实现 Book类总代码: 4. BookList类的实现 BookList类总代码: 5. 用户的操作 5.1 AddOperation类…