我试图解决以下问题:
有3个小时的数学,2个phisics和3个信息学。我需要生成所有可能的时间表,以便一天必须至少有1个小时的这些科目,最多3个(这可能是数学 - 数学 - 数学或数学 - 物理 - 信息学)
时间表为5天。 所以我提出了以下解决方案:
让生成(k,o)成为'生成器'功能为第k天,o小时,o为1至3
每天k和小时o挑选一个仍然在我们左边的主题。我通过数组counter[i] = TakenCount
跟踪它,其中i是1,2,3,对应于数学,物理和信息学,而TakenCount意味着我使用了多少小时。
对于配置,我使用矩阵v[k][o]
,它为我提供了第k天的配置,小时为o
这是我迄今为止尝试过的代码
h = ['', 'm', 'f', 'i']
counter = [0, 0, 0, 0]
limit = [0, 3, 2, 3]
v = [['' for x in range(4)] for x in range(6)]
def generate(k, o):
if k == 6:
if counter[1] == limit[1] and counter[2] == limit[2] and counter[3] == limit[3]:
showConfig()
else:
for i in range(1, 4, 1):
if counter[i] != limit[i]:
v[k][o] = h[i]
counter[i] += 1
generate(k + 1, 1)
generate(k + 1, 2)
generate(k + 1, 3)
v[k][o] = ''
counter[i] -= 1
def showConfig():
print '-- Configuration --'
print counter
for i in range(1, 6, 1):
print 'Day ', i,
success = False
for j in range(1, 4, 1):
print v[i][j],
print '-- End --'
generate(1, 1)
generate(1, 2)
generate(1, 3)
用Python编写,但我认为这不是问题,因为它很容易阅读
这里的问题是我永远不会在v[i][2]
和v[i][3]
内有时间,只有v[i][1]
和条件
counter[1] == 3, counter[2] == 2 and counter[3] == 3
永远不会成真,我不知道为什么。
在我第二天生成k + 1
后,小时1,2和3,我需要重置当前v[k][o] to
''和counter[i]
到counter[i] - 1
这不是家庭作业或类似的东西。我问的是解决方案是否良好,如果是,那么我在代码中做错了什么?因为我似乎无法找到
输出示例:
( (m), (m, f), (m, f, i), (i), (i) )
...
( (m, i), (f), (i), (m, f, i), (m) )
( (m, f), (i), (i), (m, f, i), (m) )
其中m是数学,f是物理学和信息学,每个paranthesis是WEEK的一天,所以5周1周
答案 0 :(得分:0)
这是你想要的:
from itertools import permutations
def possible_permutations(*args):
length_args = len(args)
args_list, permutations_list = [], []
for arg in args:
args_list.append(arg)
permutations_list.append(tuple(permutations(args_list)))
# Clean ugly list of touples of touples into a list of touples.
perms = []
for perm in permutations_list:
for p in perm:
perms.append(p)
return perms
def schedules(days, *classes):
possible_perms = possible_permutations(*classes)
for perm in permutations(possible_perms, days):
print(perm)
schedules(5, 'math', 'science', 'english')
<小时/> OLD ANSWER
我不清楚你的要求是什么,但我相信这可以解决你的问题。
from itertools import permutations
CLASSES = {'math':3, 'physics':2, 'informatics':3}
def possible_schedules(**classes_hours):
k, v = [k for k, v in classes_hours.items()], [v for k, v in classes_hours.items()]
k_perms, v_perms = permutations(k), permutations(v)
perms = zip(k_perms, v_perms)
for k_perm, v_perm in perms:
perm = tuple(zip(k_perm, v_perm))
print(perm)
possible_schedules(**CLASSES)
输出:
(('physics', 2), ('math', 3), ('informatics', 3))
(('physics', 2), ('informatics', 3), ('math', 3))
(('math', 3), ('physics', 2), ('informatics', 3))
(('math', 3), ('informatics', 3), ('physics', 2))
(('informatics', 3), ('physics', 2), ('math', 3))
(('informatics', 3), ('math', 3), ('physics', 2))