You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用暴力法实现类二叉树结构员工最优评分组合生成程序

暴力法实现无直属上司冲突的最大评分员工选择方案

核心逻辑

暴力法的本质是枚举所有合法的员工组合,计算每个组合的评分总和,最终选出总和最高的组合。合法组合的判定标准是:组合内不能同时存在任何员工与其直属上司。

执行步骤

  1. 生成所有员工子集:遍历员工列表的所有可能子集(幂集),每个子集作为候选组合。
  2. 筛选合法组合:对每个候选子集,检查是否存在员工与直属上司同时入选的情况,剔除非法组合。
  3. 计算合法组合评分:对每个合法子集,累加所有员工的评分总和。
  4. 锁定最优组合:对比所有合法组合的评分总和,记录总和最高的员工列表。

代码实现示例(Python)

假设已整理好的员工节点结构如下:

class Employee:
    def __init__(self, name, score, manager):
        self.name = name
        self.score = score
        self.manager = manager  # 直属上司对象,无上司则为None

暴力法核心代码

def find_max_score_team(employees):
    total_emps = len(employees)
    max_score = -1
    best_team = []

    # 用二进制掩码枚举所有子集:从0到2^total_emps - 1
    for mask in range(0, 1 << total_emps):
        current_team = []
        current_score = 0
        is_valid = True

        # 遍历每个员工,判断是否被选入当前子集
        for idx in range(total_emps):
            if mask & (1 << idx):
                emp = employees[idx]
                current_team.append(emp.name)
                current_score += emp.score

                # 检查直属上司是否也在当前子集中
                if emp.manager is not None:
                    # 找到上司在数组中的索引
                    manager_idx = next((j for j in range(total_emps) if employees[j] == emp.manager), -1)
                    if manager_idx != -1 and (mask & (1 << manager_idx)):
                        is_valid = False
                        break

        # 更新最优组合
        if is_valid and current_score > max_score:
            max_score = current_score
            best_team = current_team.copy()

    return best_team, max_score

代码说明

  • 子集枚举:通过二进制掩码mask表示子集,每一位对应一个员工,1代表选中该员工,0代表不选。
  • 合法性校验:每选中一个员工,立即检查其直属上司是否也被选中,若存在则标记该子集非法。
  • 最优解更新:遍历所有合法子集,保留评分总和最高的员工列表。

注意事项

  • 暴力法时间复杂度为O(2^n * n),仅适合员工数量n≤20的小规模场景,员工数量过多时运行效率会急剧下降。
  • 需确保员工节点的manager指针正确指向直属上司对象,避免空指针或错误引用。

内容的提问来源于stack exchange,提问作者jum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:45:23