检查组合是否与给定集匹配

时间:2009-11-18 04:36:13

标签: set combinations

基本上我正在寻找一种解决方案,如果给定的组合与给定的组匹配,则返回。

示例:我有一个数组存储哪个计算机房和哪个工作场所有哪些设备。我需要找出具有特定需求的特定数量的用户是否可以进入计算机房。索引是我的例子中的工作场所编号。

$aComputerRoomEquipment = array();
$aComputerRoomEquipment[1] = array("PC");
$aComputerRoomEquipment[2] = array("PC");
$aComputerRoomEquipment[3] = array("PC", "Scanner");
$aComputerRoomEquipment[4] = array("PC", "Printer");
$aComputerRoomEquipment[5] = array("PC", "Scanner", "Printer");
$aComputerRoomEquipment[6] = array("PC");
$aComputerRoomEquipment[7] = array("PC", "Scanner", "Printer");
$aComputerRoomEquipment[8] = array("PC");

我需要回答以下问题:如果我有两个用户需要扫描仪,而我有三个用户需要打印机,那么它们是否适合我的计算机房?

所有属性的简单总和不起作用,因为如果我在房间里放三个需要打印机的人,就不会有需要扫描仪的穷人的工作场所。

我已经考虑过迭代所有可能的组合,但工作场所的数量越大,所需的时间就越长,可能需要永远完成。

3 个答案:

答案 0 :(得分:0)

如果你之后添加他们需要的东西怎么样,所以当你将人1添加到房间里时。您看到他需要一台打印机,您将打印机添加到房间内的新人群中以及他们目前拥有的内容。

因此,当您添加新人时,您需要检查当前状态,而不是人员的需要。

答案 1 :(得分:0)

当我第一次阅读本文时,它闻起来像一个NP完全问题 - 它仍然有那种香气。

但我喜欢ÓlafurWaage的回答。

如果您一次带一个用户,那么您可以解决问题。即让第一个用户到达他们需要的工作站,或者如果没有合适的工作站 - 即。下一个用户“需要一台打印机但是唯一一台带有打印机的工作站已经有一台扫描仪”,然后继续将它们放在带有打印机和扫描仪的工作站上。

如果那不是你想要的 - 如果确实如此,那么你计划提前一天使用这个房间一整天的用户,你想知道的是“可行与否”--- - 然后我建议你在花费太多时间之前先看看http://en.wikipedia.org/wiki/NP-complete

答案 2 :(得分:0)

你在谈论多重集合,而不是普通集合。无论如何,如果在你给出的唯一例子中,房间里的每个人都需要一个资源,而且只有两个资源很重要,生活就非常容易:按照丰富程度对设备阵列进行排序(仅限扫描仪,仅打印机,两者 - 提供的条目都不重要!),为每个资源分配尽可能多的一个资源 - 仅为min(可用,请求)(并删除相应的请求者),如果“两个”的数量,答案最终为“是”资源“设备剩余是> =请求者的数量。

如果您可以更清楚地指定要解决的问题类别,那么答案可以相应地加强(没有任何约束,它肯定会是NP完全问题,正如另一个答案所暗示的那样 - 但是,足够的约束可以使它在计算上可行!)。