通过率 60% · 提交 543 · 通过 327
小慕正在组织一场团队协作挑战赛,有 10 名队员参与,需要分成两队,每队 5 人。 每位队员都有一个能力评分,代表其个人水平。 为了让比赛尽可能公平,小慕希望将 10 名队员分成实力尽可能接近的两队。 一队的实力定义为该队 5 名队员的能力评分之和。 现在给出这 10 名队员的能力评分,请你帮小慕完成分队,并输出两队实力差的绝对值。 例:10 名队员的评分分别为 5 1 8 3 4 6 7 10 9 2,分组为 (1 3 5 8 10) 和 (2 4 6 7 9),两队实力差最小,差值为 1。 有多种分法,但实力差的绝对值最小为 1。
这类题属于华为 OD 机考真题方向中「100分 / DFS」方向的高频题型,通常考察对「100分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
10 个整数,表示 10 名参与者的游戏水平评分。范围在[1,10000]之间
1 个整数,表示分组后两组实力差绝对值的最小值。
示例 1
输入示例
1 2 3 4 5 6 7 8 9 10
输出示例
1
10 名队员分成两组,两组实力差绝对值最小为 1。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
两队的总评分 total_sum 是确定的。将问题转化为,在 10 个元素 中挑选出 5 个元素,使得这 5 个元素的和尽可能接近 total_sum 的一半,即 total_sum // 2。
假定元素和较小的那组为 A 组,较大的那组为 B 组。由于 sum(A) <= total_sum // 2 <= sum(B) 始终成立,因此可以只考虑小于等于 total_sum // 2 的 A 组情况即可。
在 10 个元素中挑选出 5 个元素的组合问题,很容易想到直接使用 回溯 来解决。由于只考虑 A 组情况,所以当发现 path_sum > total_sum // 2 时,可以进行 剪枝 操作。
当然 背包 DP 也可以解决这个问题,等同于需要考虑选择元素个数的 目标和 这个问题。感兴趣的同学可以自己尝试一下。
思路展开 代码把「分成实力最接近的两队」转成一个选数问题:10 人总分 total_sum 固定,只要确定其中一队(5 人)的分数和 path_sum,另一队自然是 total_sum - path_sum,差值就是 total_sum - 2 × path_sum。约定只枚举分数和不超过 target = total_sum // 2 的那一队(较小的 A 组),这样差值恒为非负,同时砍掉了一半对称的枚举。回溯函数带 startIdx 参数做组合式枚举:每层只从 startIdx 往后选人,避免同一组人按不同顺序被重复枚举。递归有两个出口:path_sum 一旦超过 target 立即剪枝返回(继续加人只会更大,这种选法对应的已不是较小那组);path_len 恰好等于 5 时用 total_sum - 2 × path_sum 更新最小差值 ans。这份实现没有显式回滚操作,因为 path_sum、path_len 都以函数参数传递,随递归返回天然复原。
复杂度分析
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有