我正在编写一个程序,根据学生和导师的可用性来组建辅导小组。可用性是用字母表示的阻塞时间列表给出的。例如,如果一个学生以[A, C, D]的形式给出他的可用性,那么他在一天的第一、第三和第四个小时都有空。你如何制作一个函数,它接受学生列表和导师列表,并给出一组列表,从而最大限度地增加一组中的学生数量?我在Java工作,但我对算法比对代码本身更感兴趣。更多细节:
小组必须包含3-6名学生和1名导师。
学生只能在一个组。
必须最大化满足学生人数(分组)。例如,假设我们有1-6名学生和两名导师,分别在A和B时间段提供。学生的导师在1:A、2:A、3:A、4:AB、5:AB、6:B时间段可用。算法应返回两组:[1,2,3,tutor1]和[4,5,6,tutor2]。这会将每个学生分配到某个组,最好是说,在一个组中放1-5人,不放6人。
你可以把这个问题看作一个图的问题:用一组不相交的子图覆盖一个二部图,同时尊重两个分区(学生,组)并最大化一个分区(学生)的覆盖
我在考虑这个启发:
请注意,这可以归结为:
快速找到一个能满足大多数人的解决方案(你可以停在这里)。然后尝试通过找到一系列配对来插入学生:
请注意,这与在二分图中寻找交替路径是同构的,并且可以这样优化。
请注意,这可能仍然无法找到最佳解决方案,因为它永远不会在单个组中替换多个人员来满足一个人。
上面的伪代码指示在每个步骤使用学生列表。相反,您可以跟踪对此列表的更改,并在进行更新时更新排序顺序。
更新:我没注意到你也想分配老师。
在这种情况下,您需要在将学生分配到小组时将教师分配到该小组。这将阻止创建某些组,但是如果没有免费的教师,则可以从不同的组中获取教师,如果您可以为该组分配其他教师。同样,它只是搜索一个交替的图表,这次是在教师小组子图中 - 让学生四处走动以释放教师似乎不可行。
你现在要覆盖的整个图形有三个分区:学生,老师,组。老师和学生不互动,所以有两层:学生-组,组-老师。这两层是独立的,除了它们必须覆盖同一组组。
以下是帮助您入门的3个想法。
>
一个贪婪的算法。将列表中的第一个学生与列表中的第一个兼容导师匹配。将列表中的第二个学生与列表中的第一个兼容导师匹配。等。
找到最“受欢迎”的可用小时,并首先匹配该小时。然后是下一个最受欢迎的,等等。
找到最不“受欢迎”的可用小时,并首先匹配该小时。然后是下一个最不受欢迎的,等等。
免责声明:我假设你是为了学习/爱好/管理的方便而工作,换句话说,你的项目没有很多钱。如果我的假设是错误的,我会建议你需要多研究算法,或者聘请有专长的人。
我无法让我的数组总结出特定的部分。 以下是我的课程说明: 编写一个程序来准备公司销售报告•该程序要求用户输入一周内三种产品的每日销售额。对3种产品和7天使用双2D阵列展示每种产品的销售额。然后,程序计算并显示以下内容:•一周内所有三种产品的销售总额。•所有产品的日平均销售额。•每种产品一周的销售总额。使用1D阵列保存每个产品的总销售额。•每种产品的日平均销售额周末所有产品的销售总额(假设第六天和第
问题内容: 如何计算值等于常数的数组中元素的数量?例, 我怎么才能直接知道里面有多少“本”? 问题答案:
假设我有一个项目列表,每个项目都由一个简单的结构定义 毛皮类的选择:长的,短的,卷曲的 如果列表中包含了这3个类别的所有排列,那么最终结果将是 第一组: 动物 [猫狗鼠马] 眼睛颜色[蓝黄绿红橙] 皮毛 [长短卷曲] null 让我们将此列表称为输入(A) 将这些项目分组后,我们可以得到:(可能有其他可能性)。分组标准将是拥有尽可能少的输出组。 第一组: 动物
问题内容: 我试图根据条件计算某个值在多维数组中出现的次数。这是一个示例数组; 如果要显示所有绿色水果,可以执行以下操作(让我知道这是否是最佳方法); 这将输出; 太好了,我可以在那里看到它们是2个值,但是实际上我如何才能让PHP计算绿色的水果数量并将其放在变量中,以便我在脚本中进一步使用以解决问题?例如,我想做类似的事情; 我看过count(); 但是我看不到任何添加“ WHERE / cond
问题内容: 我的表数据: 我需要像这样的输出 =我需要按fieldId分组。 =计算每组记录。 =这是我仅在需要分组记录数时才需要的列。 可以通过单个查询完成吗?如果是,请说明如何?如果否,那么最有效的方法是什么? 问题答案: 如果愿意,也可以使用RegEx。
问题内容: 我有以下JSON数组,我想创建对象表单状态键计数 要计算状态键值并创建以下对象 问题答案: 使用 方法 虽然可以使用 具有相同代码的方法。