我想知道解决以下问题的最佳方法是什么。 我是用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
数组/集的输入数组,找到最佳数字序列的最合理和最有效的方法是什么?
答案 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";