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

题解:学而思编程 小明的U盘

【题目来源】

学而思编程:小明的U盘

【题目描述】

在 2202 年的某一天,小明得到了一个高端 U 盘。

但是小明发现这个 U 盘有一些问题:

这个 U 盘的传输接口大小是 \(L\),只能传输大小不超过 \(L\) 的文件。

这个 U 盘容量是 \(S\),一共只能装不超过 \(S\) 的文件。

但是他要备份的资料却有很多,你只能备份其中的一部分。

共有 \(n\) 个文件,第 \(i\) 个文件的大小和价值为 \(w_i,v_i\)。小明很快发现他不可能把所有文件装进优盘,好在这是一个高端的 U 盘,他可以花钱升级接口大小、或者升级容量。每花 \(1\) 元可以将接口大小增加 \(1\),每花 \(1\) 元可以将 U 盘容量增加 \(1\)

注意:你的文件不能被分割(你只能把一个文件整个的传输进去,并储存在U盘中),你放在 U 盘中文件的总大小不能超过 U 盘容量。

现在问题来了:小明只有 \(m\) 元,他想知道,他最多可能将多大价值的文件放入 U 盘中。

【输入】

\(1\) 行,\(4\) 个正整数 \(n,m,L,S\)

\(2\) 行,\(n\) 个正整数 \(w_1,w_2,⋯ ,w_n\)

\(3\) 行,\(n\) 个正整数 \(v_1,v_2,⋯ ,v_n\)

【输出】

\(1\) 个整数,最多可以放入 U 盘的文件总价值。

【输入样例】

5 9 4 4
6 9 9 5 6
8 7 9 1 5

【输出样例】

9

【核心思想】

  1. 问题分析:给定 \(n\) 个文件(大小 \(w_i\),价值 \(v_i\)),U盘初始接口大小 \(L\)、容量 \(S\),预算 \(m\) 元。每花1元可将接口或容量增加1。文件大小必须同时满足:不超过接口大小(才能传输)和不超过U盘容量(才能存储)。可以选择升级接口使某个大文件能够传输,求在预算内能装入的最大总价值。这是一个01背包变体问题,关键在于枚举哪个文件享受接口升级优惠。

  2. 算法选择

    • 01背包dp[i][j] 表示前 \(i\) 个文件,花费不超过 \(j\) 的最大价值
    • 枚举优惠券使用:排序后枚举哪个文件使用接口升级
  3. 关键步骤

    • 按大小排序:将文件按 \(w_i\) 从小到大排序,保证枚举时前面文件都能通过当前接口
    • 01背包DP:总可用资金 = 初始容量 \(S\) + 预算 \(m\)
      • dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])(选或不选第 \(i\) 个文件)
    • 枚举升级使用:对于排序后的第 \(i\) 个文件:
      • 升级接口后的实际大小:cost = max(w[i] - L, 0)(升级后大小为 \(L\),原大小 \(w[i]\) 需要升级 \(w[i]-L\)
      • 剩余容量给其他文件:S + m - cost
      • 答案更新:ans = max(ans, dp[i][S + m - cost])
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n \times (S+m) + n \log n)\),排序 \(O(n \log n)\),背包 \(O(n \times (S+m))\)
    • 空间复杂度:\(O(n \times (S+m))\)
  5. 01背包变体(带优惠券抵扣)的核心思想

    • 排序预处理:按文件大小排序,确保枚举时前面文件都能通过当前接口大小
    • 枚举策略:枚举哪个文件使用接口升级优惠,其余文件使用普通容量
    • 费用计算:升级接口后的实际占用 = max(原大小 - 接口大小, 0)
    • 容量分配:总资源 = 初始容量 + 预算,分配给升级文件和普通文件
    • 适用于带单一优惠选择的背包问题

【算法标签】

01背包

【代码详解】

#include<bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, l, s, dp[N][20005], ans;  // dp: 背包DP数组, ans: 最终答案
struct node
{int w, v;  // w: 原价, v: 价值
} a[N];// 按原价从小到大排序
bool cmp(node x, node y)
{return x.w < y.w;
}int main()
{cin >> n >> m >> l >> s;for (int i = 1; i <= n; i++){cin >> a[i].w;  // 读取原价}for (int i = 1; i <= n; i++){cin >> a[i].v;  // 读取价值}sort(a + 1, a + n + 1, cmp);// 0/1背包:计算前i个物品,花费不超过j的最大价值for (int i = 1; i <= n; i++){for (int j = 1; j <= s + m; j++)  // 总可用资金 = 初始资金s + 优惠券价值m{dp[i][j] = dp[i - 1][j];  // 不选第i个物品if (j >= a[i].w){// 选第i个物品dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i].w] + a[i].v);}}}// 枚举使用优惠券购买的商品ifor (int i = 1; i <= n; i++){// 使用优惠券后的实际花费:原价 - 优惠券价值l,但不能为负int cost = max(a[i].w - l, 0);ans = max(ans, dp[i][s + m - cost]);}cout << ans;return 0;
}

【运行结果】

5 9 4 4
6 9 9 5 6
8 7 9 1 5
9
http://www.gsyq.cn/news/1523130.html

相关文章:

  • 从‘半选’状态聊起:如何用QSS为PyQt5/PySide2的QCheckBox设计一套专业的UI组件库?
  • Ferret多模态模型:实现像素级UI理解与指哪打哪的视觉-语言对齐
  • 2026青岛七区三市逸程手表回收指南六大维度测评 - 逸程
  • 广州同城就近选宠攻略!六大门店分区详解,不用跑远就能挑靠谱萌宠 - 润富黄金回收
  • 2026湖北武汉高三复读集训营哪家好 分层教学+心理疏导|复读提分实操指南 - 善良的阿良
  • 2026年工业润滑油/液压油/齿轮油/切削液/导热油/长城卓力普力源头厂家品牌推荐:专业润滑与防腐性能深度解析 - 品牌发掘
  • 遗传算法工程实战:动态架构、自适应调参与收敛诊断
  • Hitboxer终极指南:专业级键盘重映射与SOCD解决方案
  • 2026淮安厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • 2026合肥中考仅 200 分无缘普高,2026 技能特色班定向培养,不用打工也能升学 - cc江江
  • 2026安徽省中考 400 分临近建档线,寿春合作班 + 职教对口两条升本路 官方最新发布 - cc江江
  • 数据不平衡不是技术问题,而是业务理解的试金石
  • 网络研究观-严重漏洞允许以 root 用户身份执行任意命令:CVE-2026-0273 分析
  • 深度净化显卡驱动:Display Driver Uninstaller实战指南
  • Triton模型服务化实战:从Notebook到高可用生产部署
  • 从信息论到损失函数:KL散度和交叉熵在TensorFlow/Keras项目里到底怎么选?
  • 2026淄博大众首选贵金属回收商户名录 TOP 金条、铂金、白银线下回收门店信息一览 - 中业金奢再生回收中心
  • N皇后遗传算法实战:Python手写GA核心模块与调参指南
  • 广州家庭养宠适配测评!老人、小孩、上班族适合养什么猫狗?听劝不踩雷 - 润富黄金回收
  • LizzieYzy:围棋AI分析工具的终极指南,免费提升棋力的完整方案
  • 2026中山除甲醛公司服务实测测评:5家主流品牌价格效果售后全面对比报告 - 环保除醛知识库
  • 2026 年 6 月金价高位变现行情分析 - 润富黄金回收
  • 2026安康本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • 大模型幻觉治理实战:六类可落地的全链路防御方案
  • Display Driver Uninstaller:解决显卡驱动问题的3个关键场景与专业方案
  • 2026 年 6 月怀化黄金大盘行情深度解读 - 润富黄金回收
  • Python百度搜索API完全手册:零成本打造你的智能搜索工具链
  • 别再到处搜了!Qt QCheckBox三态(选中/未选/半选)的完整QSS样式配置,附SVG图标资源
  • 机器学习系统生产化:从模型上线到稳定运行的工程实践
  • 从一次跨域认证失败说起:实战解析Kafka集群在多Kerberos Realm环境下的配置难题