Related
In following contests:
核心思路:把每个任务维度看成一「组」物品,组内候选适配器互斥(至多启用一个),整组也可以不启用;显存预算 M 相当于背包容量,能力提升分为价值。这是分组背包:按维度逐组处理,设 fi[j] 为处理完前 i 个维度、占用显存不超过 j 时的最大提升分。对第 i 组,先保留「整组不启用」的继承值 fi−1[j],再对组内每个候选 (w,v) 用组前状态做转移 fi[j]=max(fi[j],fi−1[j−w]+v)。转移必须读取上一组的数组而非本组已更新的数组,否则会退化为同组多选,破坏互斥约束。
实现方法:滚动数组。每组开始前复制一份组前状态 pre,组内每个候选从 pre[j-w] 转移更新 f[j];容量维度无需逆序,因为读取的是 pre(冻结副本)。w>M 的候选直接跳过。全负 / 全不选情形由 f 初始为 0 自然覆盖。也可写成自顶向下的记忆化搜索 dfs(i, 剩余显存):不启用本组继承 dfs(i+1, cap),再枚举组内每个候选 dfs(i+1, cap-w) + v 取最大,两者答案一致。
时间复杂度 O(M×∑ki):每组每个候选扫描全部容量档。取上限 M=500、∑ki=1000 时约 5×105 次转移,Python 记忆化搜索实测最坏约 60 毫秒,远低于时限。空间复杂度 O(M),两个滚动数组(记忆化搜索为 O(N×M) 状态数)。
某团队将基座大模型部署到端侧设备,通过挂载 LoRA 适配器补齐不同任务维度的能力。共有 N 个任务维度,为维度 i 预备了 ki 个候选适配器;候选适配器 j 启用时占用显存 wi,j MB,带来能力提升分 vi,j。
设备总显存预算为 M MB。每个维度至多启用一个适配器,也可以整组不启用。所有启用适配器的显存占用之和不得超过 M。请求出全部启用适配器能力提升分之和的最大值。
解答要求
时间限制:C/C++ 1000ms,其他语言:2000ms
内存限制:C/C++ 512MB,其他语言:1024MB
输出一个整数,表示能力提升分之和的最大值。
输入
3 10
3
3 4
5 8
10 10
2
4 5
6 9
2
2 3
5 5
输出
13
说明
选维度 1 的适配器 (3,4) 与维度 2 的适配器 (6,9),显存占用 3+6=9≤10,提升分 4+9=13。维度 1 独占型适配器 (7,10) 虽单项提升更高,但占用全部预算后无余量,总分为 10;其余组合均不超过 13。
输入
3 6
2
3 5
4 7
2
5 3
6 4
2
2 2
4 6
输出
9
说明
选维度 1 的适配器 (4,7) 与维度 3 的适配器 (2,2),显存占用 4+2=6,提升分 7+2=9。维度 2 的两个适配器占用显存过大,与任何其他适配器同选都会超出预算,整组弃用。
In following contests:
Scan the QR code below with WeChat to sign in
设置一个用户名,下一步用微信扫码完成注册
请使用微信扫描下方二维码完成注册