当前位置: 首页 > 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.jsqmd.com/news/1151888/

相关文章:

  • 用 Node.js 打造网站完整源码下载器
  • 机器学习极速入门:10小时掌握4大核心算法与实战
  • electron中拖动文件到桌面案例
  • Layerdivider:告别手动分层,让AI智能解析你的设计图
  • CAS:142131-37-1,p-NH2-Bn-NOTA,对氨基苄基-NOTA的使用
  • SEO 转 GEO 底层逻辑:哪些能力能复用?哪些必须推翻?
  • 谷歌学术无法访问?英文文献、SCI论文、DOI高效检索方案
  • 使用 Homebrew 安装 CMake 的完整指南
  • csdn保存的仅自己可见的文章无法确保不被用于训练AI
  • DVWA 1.10 命令注入实战:3种难度绕过与防御源码分析(附Payload)
  • 突破单总线瓶颈:任意MCU共用SCL实现多路I2C并行通信实战
  • RuView 新手快速上手指南
  • 国巨PA0402系列汽车级电流检测电阻是汽车电子的“电流之眼“
  • 测试工程师转型 AI 质量保障:从测 Bug 到测“智商“
  • vLLM 与 SGLang 推理框架性能横评:架构、吞吐与延迟深度解析
  • 使用CC Switch管理Codex需切换API地址的原因
  • 3类主流湿敏传感器对比:SHT系列、电阻式与电容式的选型指南
  • 特征选择实战:Sklearn 3大方法(Filter/Wrapper/Embedded)对比与20维数据集应用
  • Codex总是改错项目规则?AGENTS.md这5项必须写清楚
  • LLM应用的后端安全防护:Prompt注入防御与输出内容审核架构
  • 国内做高校AI 教育的公司有哪些?全景解析与实战云的独特路径
  • 欧盟商标申请全攻略,中国仍是最大的申请来源国!
  • OpenClaw专栏第六篇:Docker Compose一键部署与集群扩展
  • Maya保存会报错怎么解决?
  • 另外一个AI说csdn的私有文章不会用于训练AI
  • AD5593R与MSP432P401R的硬件协同设计与信号处理
  • 移动端开发者转型 AI Agent 开发:从 App 到智能助手
  • MQ-4 甲烷传感器 Arduino 实战:0-5V 模拟信号采集与 1000ppm 报警阈值设置
  • LingBot-VLA 2.0:面向跨本体通用机器人控制的从基础模型到真实场景的视觉-语言-动作系统演进
  • PAM8124与PIC18F2525构建高效D类音频放大系统