题目
求部门安排所有组合。
示例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