问题:
具有数值的数组需要分成两半,大致相等或者如果可能的话,相等的数组和。数组中元素的数量或顺序并不重要。
$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
有什么建议吗?
感谢。
答案 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)开始:
或节省时间:
答案 3 :(得分:0)
也许对数组进行排序,从最大值开始。将另一个值放入2个数组中的一个,其中sum更小。任何人都可以查看这个解决方案吗?