当前位置: 首页 > news >正文

P1509 找啊找啊找GF【洛谷算法习题】

P1509 找啊找啊找GF

网页链接

P1509 找啊找啊找GF

题目背景

“找啊找啊找 GF,找到一个好 GF,吃顿饭啊拉拉手,你是我的好 GF。再见。”

“诶,别再见啊…”

七夕… 七夕… 七夕这个日子,对于 sqybi 这种单身的菜鸟来说是多么的痛苦… 虽然他听着这首叫做“找啊找啊找 GF”的歌,他还是很痛苦。为了避免这种痛苦,sqybi 决定要给自己找点事情干。他去找到了七夕模拟赛的负责人 zmc MM,让她给自己一个出题的任务。经过几天的死缠烂打,zmc MM 终于同意了。

但是,拿到这个任务的 sqybi 发现,原来出题比单身更让人感到无聊 -_- … 所以,他决定了,要在出题的同时去办另一件能够使自己不无聊的事情——给自己找 GF。

题目描述

sqybi 现在看中了n nn个 MM,我们不妨把她们编号1 11n nn。请 MM 吃饭是要花钱的,我们假设请i ii号 MM 吃饭要花r m b i rmb_irmbi块大洋。而希望骗 MM 当自己 GF 是要费人品的,我们假设请第i ii号 MM 吃饭试图让她当自己 GF 的行为(不妨称作泡该 MM)要耗费r p i rp_irpi的人品。而对于每一个 MM 来说,sqybi 都有一个对应的搞定她的时间,对于第i ii个 MM 来说叫做t i m e i time_itimei。sqybi 保证自己有足够的魅力用t i m e i time_itimei的时间搞定第i ii个 MM_

sqybi 希望搞到尽量多的 MM 当自己的 GF,这点是毋庸置疑的。但他不希望为此花费太多的时间(毕竟七夕赛的题目还没出),所以他希望在保证搞到 MM 数量最多的情况下花费的总时间最少。

sqybi 现在有m mm块大洋,他也通过一段时间的努力攒到了r rr的人品(这次为模拟赛出题也攒 rp 哦~~)。他凭借这些大洋和人品可以泡到一些 MM。他想知道,自己泡到最多的 MM 花费的最少时间是多少。

注意 sqybi 在一个时刻只能去泡一个 MM ——如果同时泡两个或以上的 MM 的话,她们会打起来的…

输入格式

输入的第一行是n nn,表示 sqybi 看中的 MM 数量。

接下来有n nn行,依次表示编号为1 , 2 , 3 , … , n 1, 2, 3, \ldots , n1,2,3,,n的一个 MM 的信息。每行表示一个 MM 的信息,有三个整数:r m b rmbrmbr p rprpt i m e timetime

最后一行有两个整数,分别为m mmr rr

输出格式

你只需要输出一行,其中有一个整数,表示 sqybi 在保证 MM 数量的情况下花费的最少总时间是多少。

输入输出样例 #1

输入 #1

4 1 2 5 2 1 6 2 2 2 2 2 3 5 5

输出 #1

13

说明/提示

sqybi 说:如果题目里说的都是真的就好了…

sqybi 还说,如果他没有能力泡到任何一个 MM,那么他就不消耗时间了(也就是消耗的时间为0 00),他要用这些时间出七夕比赛的题来攒 rp…

【数据规模】

对于20 % 20 \%20%的数据,1 ≤ n ≤ 10 1 \le n \le 101n10
对于100 % 100 \%100%的数据,1 ≤ r m b ≤ 100 1 \le rmb \le 1001rmb1001 ≤ r p ≤ 100 1 \le rp \le 1001rp1001 ≤ t i m e ≤ 1000 1 \le time \le 10001time1000
对于100 % 100 \%100%的数据,1 ≤ m , r , n ≤ 100 1 \le m, r, n \le 1001m,r,n100

解题思路

本题是双费用双目标01背包问题,每个物品有金钱、人品两项花费约束,需要在花费不超限的前提下,优先最大化选取的英雄数量,数量相同时最小化总耗时。通过加权合并双目标的技巧,可将问题转化为标准二维费用背包求解。

1. 问题建模
  • 每个MM对应一个可选物品,两项花费分别为金钱rmb_i和人品rp_i,对应消耗为time_i
  • 优化目标分为两级:第一优先级是选取数量最多,第二优先级是总时间最少。
  • 约束条件:总金钱不超过m,总人品不超过r。
2. 双目标加权合并技巧

由于两个目标有明确的优先级顺序,可以通过加权法将其合并为单个综合价值,最大化综合价值即可同时满足两个优先级:
构造综合价值公式:综合价值 = 选取数量 × 权重常数 - 总时间
其中权重常数必须大于最大可能的总时间,保证数量的权重永远高于时间的影响——数量多的方案综合价值一定更高;只有数量相同时,总时间更少的方案综合价值才更大。

本题中n≤100,单个时间≤1000,总时间最大为10^5,因此权重常数取大于1e5的值(如200000)即可完全保证正确性。代码中使用20000,在总时间不超过20000的场景下可正常运行。

3. 二维费用01背包实现
  • 状态定义dp[j][k]表示花费j金钱、k人品时,能获得的最大综合价值。
  • 初始状态:所有位置初始为0,对应选取0个物品、总时间为0的基准方案(0个物品对任意花费都成立)。
  • 状态转移:对每个物品,倒序遍历金钱和人品两个维度(标准01背包倒序写法,保证每个物品仅被选取一次):
    d p [ j ] [ k ] = max ⁡ ( d p [ j ] [ k ] , d p [ j − r m b i ] [ k − r p i ] + W − t i m e i ) dp[j][k] = \max(dp[j][k],\ dp[j-rmb_i][k-rp_i] + W - time_i)dp[j][k]=max(dp[j][k],dp[jrmbi][krpi]+Wtimei)
    其中W为权重常数,+W对应选取数量加1,-time_i对应累加当前耗时。
4. 结果还原

设最终最大综合价值为val = dp[m][r]

  • val == 0,说明无法选取任何MM,总时间为0。
  • 否则,选取数量为cnt = val / W + 1,总时间为cnt * W - val
    代码中的输出公式((val/W + 1) * W) - val就是该计算式的直接实现。
5. 复杂度分析
  • 时间复杂度:O ( n × m × r ) O(n \times m \times r)O(n×m×r),n、m、r均≤100,总运算量约百万级,完全适配1秒时间限制。
  • 空间复杂度:O ( m × r ) O(m \times r)O(m×r),二维DP数组空间开销极小。

总结

核心逻辑:将“优先最大化数量、再最小化时间”的双目标通过加权常数合并为单目标,转化为标准二维费用01背包问题,倒序枚举两个花费维度完成转移,最后从综合价值中还原出最小总时间。
关键操作:双目标加权合并、二维费用倒序转移、从综合值还原总时间。
效率保障:三层循环总规模仅百万级,运行速度极快。

代码简要说明

  1. 变量定义

    • c[]存储每个MM的金钱花费,w[]存储人品花费,t[]存储所需时间。
    • f[N][N]为二维DP数组,存储不同花费下的最大综合价值。
  2. DP转移

    • 外层遍历每个MM,中层倒序遍历金钱(从m到c[i]),内层倒序遍历人品(从r到w[i])。
    • 转移时加上权重20000并减去当前时间,更新最大综合价值。
  3. 结果计算
    利用公式从最终综合价值中还原出总时间并输出。

  4. 注意事项

    • 代码中权重20000在总时间超过20000时会出现精度偏差,实际应用中建议取更大的权重(如200000)保证正确性。
    • 若无法选取任何MM,代码输出结果会等于权重值,需额外判断val是否为0,输出0以符合题目要求。
  5. 输入优化:关闭流同步并解绑tie,提升数据读取效率。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;ll n,m,r;ll f[N][N],c[N],w[N],t[N];intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll i,j,k;cin>>n;for(i=1;i<=n;i++)cin>>c[i]>>w[i]>>t[i];cin>>m>>r;for(i=1;i<=n;i++)for(j=m;j>=c[i];j--)for(k=r;k>=w[i];k--)if(f[j-c[i]][k-w[i]]+20000-t[i]>f[j][k])f[j][k]=f[j-c[i]][k-w[i]]+20000-t[i];cout<<((f[m][r]/20000+1)*20000)-f[m][r]<<endl;return0;}
http://www.jsqmd.com/news/1229398/

相关文章:

  • RedisInsight架构深度解析:企业级Redis可视化管理平台的技术演进与最佳实践
  • 2026滨州贵金属回收排名 TOP5 国家资质黄金回收、铂金回收、白银回收,上门回收无套路靠谱 联系方式推荐 - 中安检金银铂钻回收
  • event是委托、函数指针的特殊形式。本文记录了部分特性。
  • 2026 杭州首饰回收价格高吗|权威合作报价更公允 - 奢侈品回收机构参考
  • 深入解析C2000实时控制器:系统控制与中断机制实战指南
  • 2026苏州钻石回收哪家资质齐全?本地榜首易奢福全城免费上门收钻戒 - 肉松卷
  • 唯样-TE | Euro NCAP 2026 来了,您的座椅位置检测还够用吗?
  • ComfyUI-ReActor:零基础入门AI面部替换,5分钟打造专业级换脸效果
  • 玉林玉州区黄金回收怎么卖不吃亏?2026 今日大盘金价 + 6 家正规门店全解析 - 不晚生活号
  • 如何检查物理主机的CPU是否已开启虚拟化功能以解决Intel VT-x/EPT不支持问题?
  • Towards AI在O‘Reilly上线:技术出版物的工程价值解析
  • 2026深圳代理记账怎么选?靠谱服务看这几点 - 信息热点
  • AI 电动滑板车智能功率 MOSFET 完整选型方案
  • ipatool终极指南:3步掌握App Store IPA文件下载技巧
  • 如何快速上手BOF_Collection:Cobalt Strike渗透测试必备工具包
  • 2025年收件箱革命:Inbox Zero开源AI邮件管家如何让你每天多出2小时
  • 2026杭州内开内倒门窗多家施工团队横向深度实测 - 中国远见品牌企业资讯
  • 天津武清城区闲置金条变现攻略,规避克扣克重回收套路技巧 - 逸程奢侈品回收中心
  • AI音乐成品优化工具怎么选:从AI混音到AI母带,把demo修到接近可发布
  • 2026福州房屋漏水维修实用指南|筑宅安房屋修缮:厨卫/阳台/外墙/屋面/地下室一站式防水修缮参考 - 筑宅安
  • gpt-tokenizer特殊令牌处理:自定义允许与禁止令牌集教程
  • Heurist Agent Framework性能优化:大规模代理系统的7个调优技巧
  • HsMod:基于BepInEx的炉石传说终极增强插件深度解析
  • 真心话测评|别再乱花钱做毕设!2026年真正免费的AI论文工具只有这一个
  • 2026最新:3款b站视频文案提取工具,亲测实用,免费版够用吗?
  • 小程序毕业设计-智慧校园餐饮服务与订单追踪系统 校园食堂订餐预约与消费统计系统 移动端校园便民点餐服务平台设计(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 天津西青杨柳青黄金回收避坑全指南,本地多年经营实体老店盘点 - 逸程奢侈品回收中心
  • 从Zuul迁移到Spring Cloud Gateway的实践指南
  • 在docker环境部署RocketMQ5.5.0
  • 恒美智造火焰石墨炉一体式原子吸收光谱仪厂家综合实力排名 - 专业仪器测评品牌推荐