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

CSP 真题解析:[CSP-J 2019-T3] 纪念品

[CSP-J 2019-T3]纪念品

摘要:本题是 2019 年 CSP-J 复赛的第三题,考察算法为动态规划。核心突破口在于"当日购买的纪念品也可以当日卖出",这使得跨越多天的复杂交易可以被拆解为独立的"相邻两天"交易。每一天只需以前一天的金币数为背包容量,以当天买入价、次日卖出价的差值为物品价值,运行一个完全背包,动态更新最大利润。多日累加后即可得到最终答案。核心考点:完全背包建模 + 逐日贪心优化。

题目描述

小伟突然获得一种超能力,他知道未来T TTN NN种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。

每天,小伟可以进行以下两种交易无限次

  1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
  2. 卖出持有的任意一个纪念品,以当日价格换回金币。

每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。

T TT天之后,小伟的超能力消失。因此他一定会在第T TT天卖出所有纪念品换回金币。

小伟现在有M MM枚金币,他想要在超能力消失后拥有尽可能多的金币。

输入格式

第一行包含三个正整数T , N , M T, N, MT,N,M,相邻两数之间以一个空格分开,分别代表未来天数T TT,纪念品数量N NN,小伟现在拥有的金币数量M MM

接下来T TT行,每行包含N NN个正整数,相邻两数之间以一个空格分隔。第i ii行的N NN个正整数分别为P i , 1 , P i , 2 , … , P i , N P_{i,1},P_{i,2},\dots,P_{i,N}Pi,1,Pi,2,,Pi,N,其中P i , j P_{i,j}Pi,j表示第i ii天第j jj种纪念品的价格。

输出格式

输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。

输入输出样例 #1

输入 #1

6 1 100 50 20 25 20 25 50

输出 #1

305

输入输出样例 #2

输入 #2

3 3 100 10 20 15 15 17 13 15 25 16

输出 #2

217

说明/提示

样例 1 说明

最佳策略是:

第二天花光所有100 100100枚金币买入5 55个纪念品1 11

第三天卖出5 55个纪念品1 11,获得金币125 125125枚;

第四天买入6 66个纪念品1 11,剩余5 55枚金币;

第六天必须卖出所有纪念品换回300 300300枚金币,第四天剩余5 55枚金币,共305 305305枚金币。

超能力消失后,小伟最多拥有305 305305枚金币。

样例 2 说明

最佳策略是:

第一天花光所有金币买入10 1010个纪念品1 11

第二天卖出全部纪念品1 11得到150 150150枚金币并买入8 88个纪念品2 221 11个纪念品3 33,剩余1 11枚金币;

第三天必须卖出所有纪念品换回216 216216枚金币,第二天剩余1 11枚金币,共217 217217枚金币。

超能力消失后,小伟最多拥有217 217217枚金币。

数据规模与约定

对于10 % 10\%10%的数据,T = 1 T = 1T=1

对于30 % 30\%30%的数据,T ≤ 4 , N ≤ 4 , M ≤ 100 T \leq 4, N \leq 4, M \leq 100T4,N4,M100,所有价格10 ≤ P i , j ≤ 100 10 \leq P_{i,j} \leq 10010Pi,j100

另有15 % 15\%15%的数据,T ≤ 100 , N = 1 T \leq 100, N = 1T100,N=1

另有15 % 15\%15%的数据,T = 2 , N ≤ 100 T = 2, N \leq 100T=2,N100

对于100 % 100\%100%的数据,T ≤ 100 , N ≤ 100 , M ≤ 10 3 T \leq 100, N \leq 100, M \leq 10^3T100,N100,M103,所有价格1 ≤ P i , j ≤ 10 4 1 \leq P_{i,j} \leq 10^41Pi,j104,数据保证任意时刻,小伟手上的金币数不可能超过10 4 10^4104

思路要点

这道题其实就是一个“知道未来物价的倒爷模拟器”。 核心突破口在于题目的一句话:当日购买的纪念品也可以当日卖出。 这意味着,我们在第 1 天买入,第 3 天卖出,其实等价于:

通过这个思路,我们可以将连续多天的复杂买卖,全部拆解为独立的“相邻两天”的交易。我们每一天只需要考虑一件事:用手头现有的金币,在今天买什么东西,明天卖掉能赚最多?

关键思路

根据题意每个物品可以无限次购买,那么每一天(除了最后一天),我们面临的其实是一个完全背包问题:

解题步骤

我们以输入样例 2为例,模拟代码的执行过程。

3 3 100 10 20 15 15 17 13 15 25 16
  1. 变量定义与初始化:

  2. 核心循环模拟:我们来模拟外层循环第一轮,即处理第 1 天向第 2 天过渡的过程(此时i = 1 i = 1i=1):

  3. 更新金币总数:第一天买卖结束,执行m += f[m];。此时m = 100 + f[100] = 100 + 50 = 150。随后,循环进入下一天(i = 2 i = 2i=2,第 2 天向第 3 天过渡),此时的背包容量(总金币数)已经滚雪球变成了150,继续重复上面的背包决策。

本题易错点

参考代码

#include<bits/stdc++.h>usingnamespacestd;intt,n,m;inta[105][105];// a[i][j] 表示第 i 天第 j 种纪念品的价格intf[10005];// f[k] 表示花费 k 枚金币能够赚取的最大利润intmain(){scanf("%d %d %d",&t,&n,&m);// 读入每天每种物品的价格for(inti=1;i<=t;i++){for(intj=1;j<=n;j++){scanf("%d",&a[i][j]);}}// 核心逻辑:枚举前 t-1 天,每次计算今天买入、明天卖出的最大利润for(inti=1;i<t;i++){memset(f,0,sizeof(f));// 每天的交易都是独立的,必须清空 DP 数组for(intj=1;j<=n;j++){// 优化:如果明天卖不上好价钱(亏本或不赚钱),直接跳过不买if(a[i+1][j]<=a[i][j])continue;// 完全背包核心转移:正序遍历容量,代表同一件物品可以被重复购买for(intk=a[i][j];k<=m;k++){intp=a[i+1][j]-a[i][j];// p 为买入 a[i][j] 赚到的利润f[k]=max(f[k],f[k-a[i][j]]+p);}}// 今天的本金 + 赚到的最大利润 = 明天的本金m+=f[m];}printf("%d\n",m);return0;}

背包问题小结

第一步:翻译核心三要素(代价、价值、容量)

第二步:写死外层循环,提取变量

第三步:靠口诀写内层循环(容易错的地方)

http://www.cnnetsun.cn/news/3234168.html

相关文章:

  • 风云变幻无常
  • 酒店的免费早餐,到底是谁在买单
  • 智慧校园系统:打造一体化教学管理与服务平台
  • 宇树Go2机器狗日常清洁与维护指南:延长硬件寿命,保障开发稳定
  • Vivado 清除IP生成缓存
  • RuView 新手快速上手指南
  • 企业为什么需要理解 AI Agent:不只是又一个技术热词
  • Attention U-Net 注意力门控模块 PyTorch 实现:3步代码解析与医学图像分割实战
  • Kepware Server 7.0 AB驱动升级:UDT智能解析与隐式报文实战指南
  • 报社登报是怎么办理的?报社登报费用是怎么算的?一文知晓
  • 别只用来刷地铁!10 个 NFC 神仙用法,一机替代钥匙、证件、办公工具
  • 【Claude Code】安装
  • 学机 1 小时胜过人工 3 年,中小企业抱团上云 “爆款” 就这么简单
  • TKL + EB:重新定义 LoRaWAN 在存量设备改造中的价值,让传统设备快速接入物联网
  • JWT 安全实战:5 种攻击手法复现与 BurpSuite 插件自动化利用
  • Copilot Workspace智能文档中枢搭建全流程:从PDF/Excel语义解析到RAG增强检索,实测响应速度提升6.8倍
  • 苏州市2026年第二批园区2A级绿色工厂申报条件及流程
  • 基于STM32单片机 wifi 智能插座 物联网插座系统 系统32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Akamai收购安全企业浏览器提供商LayerX
  • 前端转大模型:为什么学了很多,还是写不出能落地的项目?
  • 艺学启航:Python异步避坑指南,边界比写法更重要
  • Tools工具调用:连接外部能力
  • 基于UKF+SRCKF分布式驱动车辆偏角、速度估计车辆状态估计、横摆角速度,质心侧偏角估计联合仿真
  • 长期投流素材容易重复,用AI批量生成新分镜能防限流吗
  • 基于51/STM32单片机宠物自动喂食器设计 定时提醒 喂食系统32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 如何利用内部开发者平台(IDP)实现开发者自助服务?
  • AAAI 2026 | 蚂蚁虽小也能搬山:西南科大提出 AIDFusion 让轻量融合网络不再 “躺平”
  • 2026年新手必看!生辰八字排盘应用推荐:真太阳时、AI提示词和命盘复盘怎么选?
  • HTML5+CSS3 个人主页实战:5个页面布局与JS轮播特效实现
  • npm 安全审计与依赖风险排查:5步构建供应链安全防线