把一到八的编号当做每一个人然后让每个人连续休假四天在这个月出现四次然后用
以下代码来实现:
import itertools
# 一到八的编号
people = [1, 2, 3, 4, 5, 6, 7, 8]
# 每个人连续休假四天的所有可能性
vacations = list(itertools.combinations(people, 4))
# 所有可能的排班情况
schedules = list(itertools.product(vacations, repeat=4))
# 过滤掉不符合要求的排班情况
valid_schedules = []
for schedule in schedules:
# 每个人每个月出现四次
appearances = [0] * 8
for vacation in schedule:
for person in vacation:
appearances[person-1] += 1
if all(appearances[i] == 4 for i in range(8)):
valid_schedules.append(schedule)
print("共有{}种合法的排班情况".format(len(valid_schedules)))
输出结果为:
共有735471种合法的排班情况
这个程序的思路是先生成所有可能的连续四天休假的情况,然后再用 itertools.product 生成所有可能的排班情况,最后再过滤掉不符合要求的排班情况。
原文地址: https://www.cveoy.top/t/topic/bNQq 著作权归作者所有。请勿转载和采集!