学习目标
前置知识与环境
先阅读 第 14 章对应小节,并确保本机可使用 C++17。首次运行可执行 make doctor;Windows 未安装 Make 时可在仓库根使用 pnpm 命令。
题目
给定开始和结束时间,以及若干种樱花树。观赏一次消耗时间并获得美学值;数量标记为 0 表示可观赏无限次,1 表示一次,大于 1 表示最多该次数。求时间内最大美学值。
输入格式
第一行 HH:MM HH:MM n,随后 n 行为 time value count。
输出格式
输出最大美学值。
数据范围
可用时间不超过 1000 分钟,树种数不超过 10000,单次时间为正。
样例输入
text
08:00 09:00 3
10 5 0
30 20 1
15 8 2样例输出
text
36做题前先填状态卡
| 问题 | 本题答案 |
|---|---|
| 状态 | dp[t] 表示用时不超过 t 的最大美学值。 |
| 选择 | 按 count 将物品分别视为完全、0-1 或二进制拆分的多重物品。 |
| 转移 | 完全物品容量正序;0-1 与拆分组容量倒序。 |
| 初值 | 所有时间状态初值为 0。 |
| 顺序 | 逐种处理,根据类型选择容量方向。 |
| 答案 | dp[可用分钟]。 |
不要急着写循环。先用一个最小输入手算状态表,再检查每个右侧依赖是否已经计算;如果依赖来自“当前物品的新状态”,还要说明这是否意味着允许重复选择。
复杂度目标
时间约 O(T∑log count),完全物品按 O(T) 处理。
测试设计提示
公开测试共 20 组、总分 100 分,覆盖样例、最小规模、单行/单列或单元素、不可达/全负/重复值等题型边界,以及容易暴露循环方向和初始化错误的回归输入。测试只接受标准输出;调试信息请写到标准错误。
运行与评分
powershell
cd labs/chapter-14/exercise/E-14-28-cherry-blossom-mixed-knapsack
make run
# 没有 Make 时,在仓库根执行
pnpm lab:run -- labs/chapter-14/exercise/E-14-28-cherry-blossom-mixed-knapsack
# 作者与 CI 的严格检查
pnpm lab:verify -- labs/chapter-14/exercise/E-14-28-cherry-blossom-mixed-knapsack完成清单
思考与复盘
- 如果改用另一种状态定义,转移和循环顺序会怎样变化?
- 哪个最小反例最容易暴露「先正确解析跨小时的分钟差;
count=0不是“没有”,而是无限。」? - 能否压缩空间?压缩后会不会覆盖本轮仍需读取的状态?
题目来源与课程化说明
核心问题参考 洛谷 P1833。本 Lab 为课程标准输入/输出环境重新表述题面,并独立编写参考实现与测试数据;不复制第三方题解、代码或隐藏测试。