通过率 0% · 提交 0 · 通过 0
这道 OJ 的配套动画
0-1 背包 · 对应本题的思路、过程和代码
一台推理服务器的显存预算为 C MB。现有 n 个候选模型,第 i 个模型部署后占用显存 w_i MB,带来收益 v_i。每个模型至多部署一份,所选模型的显存占用之和不能超过 C。请输出可以获得的最大总收益。注意:w_i 可以为 0,表示该模型经过量化后几乎不占显存,可以直接部署。
这类题属于算法机考高频题型中「华为 AI 岗 / 0-1 背包」方向的高频题型,通常考察对「华为 AI 岗 / 0-1 背包」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入两个整数 n C。随后 n 行,每行两个整数 w_i v_i,表示一个模型的显存占用与收益。
输出一行一个整数,表示最大总收益。
1 <= n <= 300;0 <= C <= 30000;0 <= w_i <= 30000;0 <= v_i <= 10000。
示例 1
输入示例
4 10 3 4 4 5 5 6 2 3
输出示例
13
基础混合选择
示例 2
输入示例
3 5 0 7 6 9 5 4
输出示例
11
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
训练营动画视频讲解
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
零占用模型直接部署
时间限制 2000 ms · 内存限制 256 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有
这些是真正决定能不能 AC、但通用题解里常被略过的点。
定义 dp[c] 为显存占用不超过 c 时可获得的最大收益。逐个处理模型;对于显存为 w、收益为 v 的模型,从容量 C 向 w 倒序更新 dp[c]=max(dp[c],dp[c-w]+v)。倒序保证每个模型最多选择一次。显存为 0 的模型也可以按同一倒序更新,每个状态在本轮只增加一次;实现中可单独累计这类模型以简化循环。
处理第 i 个模型时,每个状态只有“不选”和“选一次”两种来源。倒序遍历使 dp[c-w] 仍是尚未使用第 i 个模型的状态,因此不会重复部署同一模型。归纳处理完全部模型后,dp[C] 覆盖所有显存不超过 C 的合法选择,并取其中最大收益。
时间复杂度为 O(nC),一维状态数组占 O(C) 空间。
容量必须倒序遍历,正序会变成可重复选择模型的完全背包。C=0 时仍要计入显存为 0 的模型;显存超过预算的模型不能选择,收益为 0 的模型不会提高答案。
# 0-1 背包:dp[c]=占用不超 c 的最大收益,容量维倒序防同一模型重复部署
# w=0 的模型只赚不亏,收益单独累加,不进背包循环
import sys
def solve() -> None:
data = sys.stdin.buffer.read().split()
if not data:
return
it = iter(data)
n = int(next(it))
cap = int(next(it))
dp = [0] * (cap + 1)
for _ in range(n):
w = int(next(it))
v = int(next(it))
if v <= 0:
continue
if w == 0:
dp = [x + v for x in dp]
elif w <= cap:
old = dp[: cap + 1 - w]
dp[w:] = [b + v if b + v > a else a for a, b in zip(dp[w:], old)]
print(dp[cap])
if __name__ == "__main__":
solve()