Algorithm 在给定条件下可形成的测验的最大数量

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,我们最

共有n个问题可用。目标是在以下条件下找到并生成尽可能多的测验

输入:

  • 每个问题属于这三个类别中的任何一个。即
    JAVA
    PYTHON
    MYSQL
  • 每个问题属于2个难度级别中的任意一个
    简单
    困难
测验必须满足的规则:

  • 每个类别必须至少有一个问题(java | python | mysql

  • 每个难度级别至少有2个问题

  • 测验必须包含5个问题。(让我们拨打这个号码K

  • 问题一旦添加到测验中,就不能在任何其他测验中重复

我尝试了以下策略的天真方式:

  • 形成n/k

  • 如果有15个问题,k=4,我们最多可以组成15/4=3个小测验(小组)

  • 对于每个组,迭代问题并将其添加到满足条件的组中

  • 如果添加了问题,则降低测验的难度要求和类别要求

一旦我们有满足最低条件的小组,迭代剩余问题并将其添加到测验中,以便测验将包含K问题

问题是,只有当输入问题处于特定的有利顺序时,它才起作用。我运行这个程序时,输入的问题被随机洗牌。我得到了不同的结果。(如果需要,我可以共享代码

所以,我的理解是,上述解决方案不可靠。我们必须彻底检查所有问题的组合。这似乎与最小硬币更换问题非常相似

这与
MCC
有以下不同之处

  • 硬币供应有限。{1,1,2,2,2,3,4,5}
  • 我们不需要硬币的数量,而是需要满足某些条件的一组硬币
  • 最大化。不是最小化
  • 最大化满足给定条件的组数(不是硬币)
  • 我知道这有一个DP解决方案。我花了几天的时间想弄清楚这段关系。但我没能做到

    如何使用DP解决此问题?如何推导这个问题的递推关系?如果可能,请从递归解决方案开始

    一个基于以下内容的想法:

    考虑
    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

    您找到解决方案了吗?没有@ShivamPokhriyal。我想在空闲时间解决这个问题。我还不知道。