Algorithm 在给定条件下可形成的测验的最大数量
共有n个问题可用。目标是在以下条件下找到并生成尽可能多的测验 输入:Algorithm 在给定条件下可形成的测验的最大数量,algorithm,data-structures,dynamic-programming,coin-change,Algorithm,Data Structures,Dynamic Programming,Coin Change,共有n个问题可用。目标是在以下条件下找到并生成尽可能多的测验 输入: 每个问题属于这三个类别中的任何一个。即JAVA,PYTHON和MYSQL 每个问题属于2个难度级别中的任意一个简单和困难 测验必须满足的规则: 每个类别必须至少有一个问题(java | python | mysql) 每个难度级别至少有2个问题 测验必须包含5个问题。(让我们拨打这个号码K) 问题一旦添加到测验中,就不能在任何其他测验中重复 我尝试了以下策略的天真方式: 形成n/k组 如果有15个问题,k=4,我们最
- 每个问题属于这三个类别中的任何一个。即
,JAVA
和PYTHON
MYSQL
- 每个问题属于2个难度级别中的任意一个
和简单
困难
- 每个类别必须至少有一个问题(java | python | mysql)
- 每个难度级别至少有2个问题
- 测验必须包含5个问题。(让我们拨打这个号码K)
- 问题一旦添加到测验中,就不能在任何其他测验中重复
- 形成n/k组
- 如果有15个问题,k=4,我们最多可以组成15/4=3个小测验(小组)
- 对于每个组,迭代问题并将其添加到满足条件的组中
- 如果添加了问题,则降低测验的难度要求和类别要求
MCC
有以下不同之处
N
有效的测验(N
)。我们想制作一系列测验(尽可能大),使其测验不相交:它们没有共同的问题
- 假设测验是(图形的)节点
- 如果没有共同的问题,一个测验与另一个测验是相关的:存在一个优势
- 建立最大集团
G
function buildClique(clique, nodes)
if nodes.empty
return clique
n = nodes[0]
if clique + n is not a clique
return buildClique(clique, nodes - n)
return max( //consider returning the clique which is the biggest
buildClique(clique + n, nodes - n) // add the node to the clique
buildClique(clique, nodes - n) // do not add it
)
通过从每个节点构建最大的集团,您将获得最大的集团
bestClique = []
forall nodes as n
clique = buildClique([n], nodes - n)
if size(clique) > size(bestClique)
bestClique = clique
DP方面(通过说明最大集团由较小规模的集团组成),我们可以
- 建立所有规模
的集团1
- 通过将“兼容”节点添加到每个大小为
1
- 诸如此类
- 直到没有规模
:我们可以采取任何规模m
m-1