P4912 帕秋莉的魔法 题解

news/2025/3/10 17:26:38/文章来源:https://www.cnblogs.com/firsry/p/18696930

P4912 帕秋莉的魔法 题解

本题是处理 含有负值的01背包 的【模板】

题目翻译:

\(n\) 个物品,\(m\)初始资金,对于每个物品 \(i\)\(cost[i]\)花费\(value[i]\)收益,而且我们只能按照输入的先后顺序选择物品,并且对于每次选择物品,会获得 \(w[i][j]\)增益,一并加在价值当中。

我们显然可以用 \(f[i][j]\) 唯一确定一种状态:考虑前 \(i\) 个物品时,用 \(j\) 的代价得到的最大收益表示为 \(f[i][j]\)。这个只要是做了背包的同学都没有问题。(应该没有人把水紫当成 采药 来做吧)

每个物品只有选或不选两种可能。不选则保持原状态。选则考虑从谁转移而来。题目要求按输入的顺序,所以在第 \(i\) 个的时候可以考虑 \([0,i)\) 的情况,我们用变量 \(k\) 实现枚举。所以 \(f[i][j]\) 可以由 \(f[k][j']\) 得来,而 \(j'+cost[i]=j\) 所以得到如下状态转移方程:

\(f[i][j] = \max(f[i][j], f[k][j-cost[i]]+value[i]+w[k][i])\)

重点来了:处理负数

由于 冰冷昂贵入云涉水的 Cpp 语言不支持数组下标为负,所以使用平移的方式转正,平移的量取决于最小的负值:\(-2500\) ,所以设 :

cosnt int mov = 2501; // move 为一个 Cpp 函数

  1. 转移边界。本身边界在 \(f[0][0]\) 位置,表示 没有物品没有花费 的情况,应该初始化为 \(0\),但现在平移了 \(mov\),所以 \(f[0][mov]=0\)

  2. 循环条件。现在把 \(mov\) 看成零,因为 \(cost\) \(value\) \(w\) \(m\) 都有可能是负值,所以我们必须考虑很小到很大的值。在转移中有 \(j-cost[i]\) 这一步,所以 \(j>=cost[i]\) 这是起码的。\(j\) 的最大值就是当 \(m==2500\) 的时候可以取到 \((mov<<1)+1\) 的值。所以调的最久的

    for(int j=cost[i];j<=(mov<<1)+1;++j)

    已经考虑完毕了。

  3. 初始化以及输出。状态转移中使用了 \(\max(f[i][j],...\) ,所以 \(f[i][j]\) 必须初始化为一个极小值,个人喜欢

    const ll INF = 0x3f3f3f3f3f3f3f3f ,

    但其实不开 龙龙\(int\) 都没有关系。输出的时候我们要找的是所有花费为 \(m+mov\) 的情况中收益最高的,所以用 \(ans=-INF\) 然后遍历即可。

那么本篇题解就...

还没完呢!小子!

在循环条件中有一个必不可少的句子:

if(f[k][j-cost[i]]!=-INF)

为什么?因为他此时依靠的\(f[k][j-cost[i]]\) 必须是有意义的。他可能后来被 \(f[0][mov]\) 间接地赋上有意义的值,但是此时他的 -INF 并不是可以利用的,所以要排除掉。(本蒟蒻在这里 WA了两三次 ... )

顺带提一下,虽然用 vector 又慢又要手动处理边界,但是 vector 提供的 .at(i) 数组访问形式,在功能上和 [i] 一致,并且在数组越界的时候可以抛出异常,在 Run Time Error 的时候值得一试。

#include<bits/stdc++.h>
#define ll long longusing namespace std;const ll mov = 2501;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
vector<ll> cost, value;
vector<vector<ll>> w, f;void in() {scanf("%lld%lld", &n, &m);cost.resize(n + 1), value.resize(n + 1);w.resize(n + 1, vector<ll>(n + 1));f.resize(n + 1, vector<ll>(mov * 2 + 5000, -INF));for (int i = 1; i <= n; ++i)scanf("%lld%lld", &cost.at(i), &value.at(i));for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)scanf("%lld", &w.at(i).at(j));return;
}
ll dp() {f.at(0).at(mov) = 0;for (int i = 1; i <= n; ++i)for (int j = cost[i]; j <= (mov<<1)+1; ++j)for (int k = 0; k < i; ++k)if (f[k][j - cost[i]] != f[0][0])f[i][j] = max(f[i][j], f[k][j - cost[i]] + value[i] + w[k][i]);ll ans = f[0][0];for (int i = 0; i <= n; ++i)ans = max(ans, f.at(i).at(m + mov));if (ans == f[0][0]) ans = -1;return ans;
}int main() {in();cout << dp();return 0;
}

华丽结束,希望能排到你的 WA 点。

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

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

相关文章

Windows安装Mysql-5.7(解压包方式)

1、下载Mysql的安装包下载地址:https://downloads.mysql.com/archives/community/ 注意:官网的下载速度可能很慢,有任务时间要求的须尽快下载,或者使用其他可靠的下载源2、选择对应的版本注意:选择完MySQL的版本后,可以看到下载列表中有两个可以选择,下载名字不带 Debug …

无耳科技 Solon v3.0.7 发布(2025农历新年版)

新一代,面向全场景的 Java 企业级应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。采用对商业应用友好的 Apache 2.0 开源协议。Solon 框架! Solon 框架由杭州无耳科技有限公司(下属 Noear 团队)开发并开源。是新一代,面向全场景的 Java 企业…

橡胶 2025年

大周期 C浪结束后 拔起的第一波:节后16900附近计划做到橡胶

【洛谷P1126】机器人搬重物

是搜索play的第四弹! 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 \(1.6\) 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 \(N\times M\) 的网格,有些格子为不可移动的障碍。机器人的中心总是…

数据库安全管理中的权限控制:保护数据资产的关键措施

title: 数据库安全管理中的权限控制:保护数据资产的关键措施 date: 2025/2/2 updated: 2025/2/2 author: cmdragon excerpt: 在信息化迅速发展的今天,数据库作为关键的数据存储和管理中心,已经成为了企业营运和决策的核心所在。然而,伴随着数据规模的不断扩大和数据价值的…

动手学大模型应用开发,第3天:大模型开发流程及架构

一、大模型开发整体流程 1. 何为大模型开发 我们将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。开发大模型相关应用,其技术核心点虽然在大语言模型上,但一般通过调用 API 或开源模型…

Omnissa Horizon 8 2412 (8.14) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon 8 2412 (8.14) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件Omnissa Horizon 8 2412 (8.14) - 虚拟桌面基础架构 (VDI) 和应用软件 之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接:https://sysin.org/blog/omnissa-hor…

VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案

VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.21 - 运营商 Kubernetes 解决方案 Kubernetes-based container solution with advanced networking, a private contain…

关于 高精度性能计数器的频率 和 cpu 频率 不一致问题

/* rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。rdtsc指令就是从该寄存器中进行获取的…

《操作系统真象还原》第十一章 TSS与用户进程

本文介绍了TSS(Task State Segment)的概念及其在操作系统中的应用。TSS是用于存储任务状态的数据结构,每个任务都有自己的TSS,包含任务切换时需要保存和恢复的信息。Intel建议为每个任务关联一个TSS,CPU通过TR寄存器指向当前任务的TSS,实现任务切换。现代操作系统采用基于…

【渗透测试】Vulnhub GROTESQUE 1.0.1

渗透环境 攻击机: IP: 192.168.10.18(Kali) 靶机: IP:192.168.10.9 靶机下载地址:https://www.vulnhub.com/entry/grotesque-101,658/ 涉及知识点:WordPress扫描(WPScan)、WrodPress反弹shell、Keypass文件解密进行渗透 一、 获取端口信息 nmap或者arp-scan都能…