Algorithm 子集与集合覆盖

Algorithm 子集与集合覆盖,algorithm,permutation,combinatorics,Algorithm,Permutation,Combinatorics,我们有很多锁,要打开这些锁,我们需要一组人来打开那把锁。考虑到我们拥有的人数和需要打开的锁的数量,我们需要一个关于如何在可用人员之间分配钥匙的规范,以便打开该锁所需的任何人数的人都可以打开该锁,但任何少于所需人数的组都不能打开该锁 人数将在1-9之间,打开锁所需的人数将在0-9之间 考虑下面的例子 可用人数=2人 所需数量=1 答案:{{0},{0} 他们中的任何一个都可以打开它,所以他们都有相同的钥匙 可用人数=5人 所需数量=3 答案:{0,1,2,3,4,5},{0,1,2,6,7,8},

我们有很多锁,要打开这些锁,我们需要一组人来打开那把锁。考虑到我们拥有的人数和需要打开的锁的数量,我们需要一个关于如何在可用人员之间分配钥匙的规范,以便打开该锁所需的任何人数的人都可以打开该锁,但任何少于所需人数的组都不能打开该锁

人数将在1-9之间,打开锁所需的人数将在0-9之间

考虑下面的例子

可用人数=2人

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

他们中的任何一个都可以打开它,所以他们都有相同的钥匙

可用人数=5人

所需数量=3

答案:{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}

有人能帮我解决这个问题吗

谢谢

设n为总人数,m为打开所有锁所需的最小人数

然后,有两个要求:

  • 对于每一把锁,任何一组m个人必须至少有一个人拥有该锁的钥匙。换句话说,没有给定密钥的人的集合必须少于m人。因此,每个密钥必须至少分配到n个−m+1人
  • 每套m−1个人,必须至少有一把他们都没有钥匙的锁。换句话说,如果你把这个转过来看看“其他人”集合,它有n个−m+1人,你可以说每一组n−m+1人,必须至少有一把钥匙仅由该组人员持有
把这两个需求放在一起,我们实际上在(键)和(n的集合)之间有一对一的映射−m+1人)


所以你只需要找到n的所有集合−m+1人(这在O(2n)时间内是微不足道的,在O(C(n,n)时间内不是很难做到)−m+1)次)。对于每个集合,创建一个密钥并将其分发给该集合中的人员。

您能解释一下您所说的所有n-m+1人集合的部分吗。你这是什么意思?@SiddharthShah:例如,如果人是{Alice,Bob,Carol},那么“所有两个人的集合”将是{{Alice,Bob},{Alice,Carol},{Bob,Carol}。非常感谢,还有一个疑问。你能给这个陈述举个例子吗?“对于每个集合,创建一个键并将其分发给该集合中的人”。@SiddharthShah:那么,如果一个集合是{Alice,Bob},那么你可以创建一个分配给{Alice,Bob}的键#0。这里的键是从1到9的数字,所以我应该将什么数字分发给组中的成员?