【发布时间】:2017-03-31 12:15:52
【问题描述】:
我正在尝试查找笛卡尔积并附加特定标准。
我有四个池,每个池 25 人。每个人都有一个分数和一个价格。每个池子里的每个人看起来都是这样的。
[0] => array(
"name" => "jacob",
"price" => 15,
"score" => 100
),
[1] => array(
"name" => "daniel",
"price" => 22,
"score" => 200
)
我想找到最佳的人员组合,从每个池中挑选一个人。但是,有一个上限价格,任何分组都不能超过某个价格。
我一直在弄乱笛卡尔和排列函数,似乎无法弄清楚如何做到这一点。我知道如何编写代码的唯一方法是嵌套 foreach 循环,但这非常费力。
如您所见,下面的这段代码效率非常低。特别是如果池增加!
foreach($poolA as $vA) {
foreach($poolb as $vB) {
foreach($poolC as $vC) {
foreach($poolD as $vD) {
// calculate total price and check if valid
// calculate total score and check if greatest
// if so, add to $greatest array
}
}
}
}
我还认为我可以找到一种方法来计算总价格/得分比率并将其用于我的优势,但我不知道我错过了什么。
【问题讨论】:
-
您可以通过按价格对每个池中的人进行排序来改进算法。当您达到价格超过限制的价格时,您不必尝试该池中的其余部分。
-
@Barmar 真是天才!这绝对应该减少许多循环。谢谢。
-
你的蛮力方法与排列无关(也不应该)。
标签: php arrays algorithm permutation cartesian-product