如何找到从多个数组中提取的最小数字总和?

时间:2014-03-13 14:22:12

标签: php arrays optimization sum minimum

我想知道解决以下问题的最佳方法是什么。 我是用PHP编写的,但它更像是一般的编程问题,我猜它涉及搜索算法和组合。

给定一个包含多个数组/数组的数组

$a[0] = array(1,2,3,4,5);
$a[1] = array(1,3,5,7,9);
$a[2] = array(2,4,6,8,10);

我想从每个数组中绘制一个数字,使得绘制数字的总和尽可能小。 此数字也必须从唯一的数组索引中绘制,因此在此示例中,您无法绘制1,1,2。 上面数组中可能的最小数字序列将是3,1,4,它们的总和为8。

现在假设一个包含每个n数字的m数组/集的输入数组,找到最佳数字序列的最合理和最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

假设所有数组都已排序,我们可以忽略索引> = n处的元素(因此我们可以专注于方形矩阵n * n)
我们在Permutations - all possible sets of numbers中递归地生成所有排列,并且对于每个排列,我们计算总和。虽然它不是最优的,但它比嵌套for n更好:

$minSum = PHP_INT_MAX;

$a[0] = array(1,2,3,4,5);
$a[1] = array(1,3,5,7,9);
$a[2] = array(2,4,6,8,10);

function pc_permute($items, $perms = array( )) {
    global $a, $minSum;
    if (empty($items)) {
        $sum = 0;
        foreach($perms as $i => $p) {
          $sum += $a[$i][$p];
        }
        if($sum<$minSum) {
          $minSum = $sum;
        }
    } else {
        for ($i = count($items) - 1; $i >= 0; --$i) {
             $newitems = $items;
             $newperms = $perms;
             list($foo) = array_splice($newitems, $i, 1);
             array_unshift($newperms, $foo);
             pc_permute($newitems, $newperms);
         }
    }
}

pc_permute(range(0,count($a)-1));

echo "$minSum\n";