将数组拆分为一半,具有相等或近似相等的数组和

时间:2011-07-20 08:13:53

标签: php arrays

问题:

具有数值的数组需要分成两半,大致相等或者如果可能的话,相等的数组和。数组中元素的数量或顺序并不重要。

$probabilites = array(0.4, 0.15, 0.1, 0.1, 0.2, 0.2, 0.3); # 1.45

$probabilites[0] = array(0.4, 0.15, 0.1, 0.1); # 0.75
$probabilites[1] = array(0.2, 0.2, 0.3); # 0.7 

有什么建议吗?

感谢。

4 个答案:

答案 0 :(得分:7)

喜欢这个吗?

<?php
$in = array(0.4, 0.15, 0.1, 0.1, 0.2, 0.2, 0.3);

// Sort array decreasing
rsort($in, SORT_NUMERIC);

// Start with two empty arrays
$arr1 = $arr2 = array();

// Put the next value in the array in the array with the lowest sum
foreach ($in as $value)
  if (array_sum($arr2) > array_sum($arr1)) $arr1[] = $value; else $arr2[] = $value;

// Wrap in array (as in question)
$out = array($arr1,$arr2);

答案 1 :(得分:3)

您知道这是http://en.wikipedia.org/wiki/Knapsack_problem吗?

它是NP-Complete,所以你不能快速完成。

对于一个小的列表,它不会太糟糕,如果你有一个更大的列表,请参阅维基百科页面上的一些解决方案。

答案 2 :(得分:0)

尝试以下方法:

以空数组A和给定数组B(在您的示例中为$ probabilities)开始:

  • 删除B的第一个元素并将其附加到A。
  • 计算两个数组之和并计算差值。
  • 重复此操作,直到差异变得更糟。
  • 当差异变得更糟(即更大)时,逆转最后一步,你就完成了。

或节省时间:

  • 首先计算B = sum0的总和。
  • 删除B的第一个元素并将其附加到A。
  • 将sum(a)与sum0 / 2进行比较。
  • 重复直到它变得更糟并逆转最后一步。

答案 3 :(得分:0)

也许对数组进行排序,从最大值开始。将另一个值放入2个数组中的一个,其中sum更小。任何人都可以查看这个解决方案吗?