情况是我必须用 x 人数来填充房间。 对于此示例,我们使用:
$persons = 7;
我得到了一个阵列:
$differentRoom = array(
'Room 1' => 1, //This room fits 1 person
'Room 2' => 2, //This room fits 2 persons
'Room 3' => 3, //This room fits 3 persons
);
现在我希望PHP能够以最短的方式完成7个组合。结果必须是,'房间3''房间3''房间1'
在另一个例子中我有
$persons = 15;
带
的数组$differentRooms = array(
'Room 1' => 4, // This room fits x persons
'Room 2' => 7,
);
这次组合不能完全是15。 在这种情况下,结果必须是超过15的组合。 在这种情况下,它将是16. 16最接近10,结果必须是。您需要:'Room 2''Room 2''Room 1'
我该怎么做?
答案 0 :(得分:2)
问题是NP难度和背包问题的变体(http://en.wikipedia.org/wiki/Knapsack_problem关于主题的更多信息)。
值得注意的修改是,您尝试尽可能接近某个值,而不是试图获得最大的重量。这可以通过改变权重函数来完成。
最佳解决方案是动态编程,您可能需要查看。然而,这更像是一个算法/ CSci问题,因此最好将它发布在数学/编程stackexchange问题板上。
答案 1 :(得分:1)
你需要贪心算法。这应该工作。我现在写了
$differentRoom = array(
'Room 1' => 4,
'Room 2' => 7
);
$persons = 15;
arsort($differentRoom);
$min_rooms_capacity = min($differentRoom);
while($persons>=$min_rooms_capacity)
{
$tmp = $differentRoom;
$toSubstract = 0;
do
{
$toSubstract = array_shift($tmp);
}
while($toSubstract>$persons);
echo $toSubstract.',';
$persons-=$toSubstract;
}
它可以被明显改进,但它应该给你如何处理这种情况的建议。我不知道英语算法的名称,但在波兰语中,直接翻译将是“背包问题”
有关贪婪算法的更多信息:http://en.wikipedia.org/wiki/Greedy_algorithm