最有效的归档

时间:2013-05-16 13:08:14

标签: php

情况是我必须用 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'

我该怎么做?

2 个答案:

答案 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