算法题练习(第四周)

news/2025/3/26 16:34:37/文章来源:https://www.cnblogs.com/Easoncalm/p/18790200

金明的预算方案【NOIP2006提高组】

分析

该问题属于带有依赖关系的背包问题,主件和附件的购买必须满足先决条件。每个主件最多有两个附件,购买附件前必须先购买对应的主件。我们需要在总预算内最大化物品的价值总和(价格乘以重要度)。

步骤分析:

  1. 数据存储: 将每个主件及其附件的信息分别存储。主件的价格和重要度存储在数组v[i][0]p[i][0]中,附件存储在对应的v[i][1]p[i][1]v[i][2]p[i][2]中。

  2. 动态规划: 使用二维数组f[i][j]表示前i个物品在预算j时的最大价值。对于每个主件,考虑四种购买组合:仅主件、主件 + 附件1、主件 + 附件2、主件 + 两个附件。更新动态规划数组时,取这些组合中的最大值。

  3. 转移方程: 对于每个主件i,遍历所有可能的预算j,检查四种组合是否可行,并更新最大价值。

代码

#include <bits/stdc++.h>
using namespace std;int n, m, v1, p1, q1;
int v[65][3], p[65][3];  // 主件i的附件价格和重要度
int f[65][32005];        // DP数组int main() {cin >> n >> m;for (int i = 1; i <= m; i++) {cin >> v1 >> p1 >> q1;if (q1) { // 附件// 找到对应的主件q1,将附件添加到其列表中if (v[q1][1]) { // 如果第一个附件位置已占,放第二个v[q1][2] = v1;p[q1][2] = p1;} else { // 否则放第一个v[q1][1] = v1;p[q1][1] = p1;}} else { // 主件v[i][0] = v1;p[i][0] = p1;}}// 动态规划处理for (int i = 1; i <= m; i++) { // 遍历所有物品,视为可能的主件for (int j = 0; j <= n; j++) {f[i][j] = f[i-1][j]; // 不选当前主件i// 检查四种组合是否可行,并更新最大值if (v[i][0] <= j) { // 仅主件f[i][j] = max(f[i][j], f[i-1][j - v[i][0]] + v[i][0] * p[i][0]);}if (v[i][0] + v[i][1] <= j) { // 主件+附件1f[i][j] = max(f[i][j], f[i-1][j - v[i][0] - v[i][1]] + v[i][0] * p[i][0] + v[i][1] * p[i][1]);}if (v[i][0] + v[i][2] <= j) { // 主件+附件2f[i][j] = max(f[i][j], f[i-1][j - v[i][0] - v[i][2]] + v[i][0] * p[i][0] + v[i][2] * p[i][2]);}if (v[i][0] + v[i][1] + v[i][2] <= j) { // 主件+两个附件f[i][j] = max(f[i][j], f[i-1][j - v[i][0] - v[i][1] - v[i][2]] + v[i][0] * p[i][0] + v[i][1] * p[i][1] + v[i][2] * p[i][2]);}}}cout << f[m][n]; // 输出最大价值return 0;
}

解释

  1. 输入处理: 读取物品信息,将主件存入对应位置,附件添加到所属主件的附件列表中。

  2. 动态规划初始化: 初始时没有购买任何物品,价值为0

  3. 状态转移: 对于每个物品i(视为可能的主件),遍历预算j,尝试四种购买组合,更新最大价值。

  4. 结果输出: 最终结果为处理完所有物品后的最大价值f[m][n]

总结

该解法通过动态规划处理主件及其附件的组合购买情况,确保在预算内获得最大价值。每个主件的四种购买组合被逐一检查并更新最优解,最终结果正确且高效。

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

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

相关文章

3.24 学习记录

实现了学习记录APP的登录注册功能

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索

2025西安交大集训Day2:DFS,BFS记忆化搜索,迭代加深搜索,二分搜索

掌握 Postman:高级 GET 请求技术与响应分析

欢迎阅读本指南,它将详细介绍如何在 Postman 中发送 GET 请求并理解 API 响应。对于希望提升 API 测试和开发能力的开发者来说,这是不可或缺的技能。 Postman 对开发者的重要性Postman 是 API 开发和测试中不可或缺的工具。它不仅简化了发送请求和分析响应的过程,还提供了一…

带你一起来熟悉linux文件权限体系

了解 Linux 文件权限对于有效且可靠的linux相关系统管理和安全管理至关重要。通过本文中概述的概念并加以实践,您将可以轻松浏览文件权限并确保 Linux 系统的完整,可靠和安全。下面将从权限的格式,常用设置,修改,解析等方面分别说明。 A).Linux 文件权限由三个权限部分组成…

OP100自动安装背板常见问题

1.运行过程中切手动,回原灯一直闪烁,始终无法执行完成 OP50自动安装座板 OP100自动安装背板 OP280自动安装上盖 这几个工站因为有记忆功能,会记住当前步序以及夹爪/吸盘上有没有物体,如果运行中切换手动,并动了气缸,会导致逻辑错乱,类似升降器的SUB40,遇到这种情况: 1…

20244217 2024-2025-2 《Python程序设计》实验一报告

学号 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 胡峻豪 学号:20244217 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境。首先在官网下载并安装PyCharm专业版,安装完成后打开软…

软件工程日报15

Android studio 实现连接远程mysql数据库,并将数据展示出来,由于之前没接触过,全靠按照博客上的指导和ai生成的代码,之后在学习一下 以下是效果

《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2441 姓名: 王晓凤 学号:20244127 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 一.实验内容 1.熟悉Python开发环境:本次实验使用了PyCharm。首先在官网下载并安装PyCharm社区版,安装完成后打开软件,创建一个新的Pytho…

抽象bug:mybatis-xml配置错误(configuration and configLocation can not specified with together)

mybatis-xml配置错误(configuration and configLocation can not specified with together) 操作 我在使用mybatis-XML映射配置时,没有将mappper的xml文件放在同名同包的路径下,而是使用辅助配置,在配置文件中设置XML路径.然而,在配置文件后,没有成功,一直报错. 错误信息:"…

关于pytorch中直接调用对象

基于之前有C++基础,对于python中的一些函数的用法总会有些疑问。 例如,为什么python可以直接调用对象,而不是调用对象里的函数呢? 以下为包含__call__函数的类的调用 除此之外, 在PyTorch 中,所有继承自 nn.Module 的类都继承了一个特殊的 call() 方法。 # 使用ToTensor创…

事务注解@Transactional

目录 1、属性介绍 2、传播机制准备例子总结3、原理 4、失效场景 一、属性介绍 1、isolation 属性 事务的隔离级别,默认值为 Isolation.DEFAULT。可选的值有:Isolation.DEFAULT:使用底层数据库默认的隔离级别Isolation.READ_UNCOMMITTED:读取未提交数据(会出现脏读,不可重…