子集和集合封面

时间:2017-01-05 01:12:56

标签: algorithm permutation combinatorics

我们获得了许多锁,并且为了打开这些锁,我们需要确切地打开那个锁。鉴于我们拥有的人数和需要打开的锁的数量,我们需要一个关于如何在可用人员中分配密钥的规范,以便打开该锁的任何数量的所需人员可以打开它,但是没有少组那些必需的人可以打开它。

人数将在1-9范围内,打开锁所需的人数将在0-9范围内

考虑以下示例

可用人数= 2

所需数量= 1 答案:{{0},{0}}

他们中的任何一个都可以打开它,因此它们都被赋予相同的密钥。

可用人数= 5

所需数量= 3

Ans:{{0,1,2,3,4,5},{0,1,2,6,7,8},{0,3,4,6,7,9},{1 ,3,5,6,8,9},{2,4,5,7,8,9}}

有人可以帮我解决这个问题。

谢谢

1 个答案:

答案 0 :(得分:1)

n 为总人数,让 m 成为打开所有锁的最小人数。

然后,有两个要求:

  • 对于每个锁,任何一组 m 人必须至少包含一个拥有该锁的密钥的人。换句话说,没有给定密钥的人群必须包含少于 m 人。因此,每个密钥必须至少分配给 n - m + 1个人。
  • 对于每组 m - 1个人,必须至少有一个锁,其中没有任何一个具有密钥。换句话说,如果你转过头看看“其他人”集合,其中 n - m + 1个人,你可以说每一组都有 n - m + 1个人,必须至少有一个所持有的密钥。

将这两个要求放在一起,我们实际上在(键)和( n - m + 1人)之间有一对一的映射。< / p>

所以你只需要找到 n - m + 1个人的所有集合(这在O中很容易做到(2 n < / em> )时间,并且在O中不太难( C n n - m + 1))时间)。对于每个集合,创建一个密钥并将其分发给该集合中的人员。