08.部门组合

题目

求部门安排所有组合。

示例1:

部门:{'frontend': [1, 2], 'backend': [3, 4], 'devops': [5]}
人数:{'frontend': 2, 'backend': 1}
组合:[[1, 2, 3], [1, 2, 4]]

要求:按员工ID升序排序

实现

/**
  * 部门安排所有组合
  * @param departments: dict, key是部门名, value是每个部门对应所有员工ID数组
  *   例 {'frontend': [1, 2], 'backend': [3, 4], 'devops': [5]}
  * @param required_department: dict, 该任务需要参与的部门和需要的人数
  *   例 {'frontend': 2, 'backend': 1}
  * @return 所有可能的员工组合, 例 [[1, 2, 3], [1, 2, 4]]. 按员工ID升序排序
*/
var staffCombinations = (department_staff_dict, required_staff) => {
  const result = [];

  var combine = (nums, k) => {
    let res = [];

    var generate = (nums, start, c) => {
      if (c.length === k) {
        res.push([].concat(c));
        return;
      }
      for (let i = start; i < nums.length; i++) {
        c.push(nums[i]);
        generate(nums, i + 1, c);
        c.pop();
      }
      return;
    };
    generate(nums, 0, []);

    return res;
  };

  let fr = combine(
    department_staff_dict["frontend"],
    required_staff["frontend"] || 0
  );
  let ba = combine(
    department_staff_dict["backend"],
    required_staff["backend"] || 0
  );
  let de = combine(
    department_staff_dict["devops"],
    required_staff["devops"] || 0
  );

  for (let f of fr) {
    for (let b of ba) {
      for (let d of de) {
        result.push([...f, ...b, ...d]);
      }
    }
  }
  return result;
},

Python实现

#!/usr/bin/python3

from itertools import combinations
from itertools import product

frontend = [1, 2]
backend = [3, 4]
devops = [5]

def department(require):
  fr = list(combinations(frontend, require.get("frontend", 0)))
  ba = list(combinations(backend, require.get("backend", 0)))
  de = list(combinations(devops, require.get("devops", 0)))
  ret = list(product(fr, ba, de))
  result = []
  for r in ret:
      result.append(list(r[0]) + list(r[1]) + list(r[2]))
  return result

print('部门任务出席所有组合', department({"frontend": 2, "backend": 1, "devops": 0}))

More

算法之排列组合问题
https://zhuanlan.zhihu.com/p/66930500

部门组合
https://www.yuque.com/gaoqingrui/zbb9bi/zgf15y