给出5个有限集a,b,c,d,e。每组都分配了任意数字:
a = 100,b = 34,c = 15,d = 89,e = 57
每组的补码具有相同的编号但是否定例如对于(a')它将是-100。
我们需要找到这些所有集合或其补语的交集,因此结果集不是空集,并且指定数字的总和是最大的。
我只看到这个问题的一个强力解决方案,但它效率很低而且不优雅。在这种情况下,我们只生成所有组合并解决它们以查看它们是否为空,组合如下所示:
{a∩b'∩c'∩d'∩e'},{a'∩b∩c'∩d∩e'},{a& #39;∩b'∩c∩d'∩e'},{a'∩b'∩c'∩d∩e'},{a' ;∩b'∩c'∩d'∩e} {a∩b∩c'∩d'∩e'},{a∩b'∩c∩ d'∩e'},{a∩b'∩c'∩d∩e},{a∩b'∩c'∩d'∩e}, {a'∩b∩c∩d'∩e'} {a'∩b∩c'∩d∩e'} {a'∩b∩c&# 39;∩d'∩e} ...
然后选择最大数字。
期待有人能想到更好的事情:)
答案 0 :(得分:1)
如果x在X中,则定义得分(x,X)为集合X的值,否则为否定。
然后,让*
表示不属于5组中任何一组的元素,可能的最高分是:
max_{x in union(A, B, C, D, E, {*}} sum_{X in A, B, C, D, E} score(x, X)
这是根据观察结果得出的,即任何特定的x都在一个集合或其补集中。你实际上不必在这里计算联合。在Python中你可以写:
def max_config(A, B, C, D, E):
best = None
for S in A, B, C, D, E, set([None]):
for x in S:
best = max(best, sum(score(x, X) for X in A, B, C, D, E)))
return best
假设集合成员资格测试为O(1),则其复杂度为O(N),其中N是给定集合的总大小。