好的,我可能错过了这样做的“正确”方式,但我仍然有一些解决方案。
无限搜索 - 尝试 2(推荐):
function get_parts3($arr,$target)
{
foreach($arr as $k => $v)
{
if($v>$target) continue;
foreach($arr as $k2 => $v2)
{
if($v2>$target) continue;
if($k2==$k) continue;
if($v + $v2 == $target)
{
return array($k,$k2);
}
}
$tmparr = $arr;
$tmparr[$k] = $target+1;
$test = get_parts3($tmparr,$target-$v);
if(is_array($test))
{
return array_merge(array($k),$test);
}
}
return false;
}
尝试了无限搜索 1 - 但是在大型数组上可能会出现性能问题。
function get_parts2($arr,$target)
{
foreach($arr as $k => $v)
{
if($v > $target) continue;
$keys = array_keys($arr);
for($i=0;$i<25;$i++)
{
$sum = $v;
$parts = array();
$parts[$k] = $v;
foreach($keys as $k2)
{
if($k2 == $k) continue;
$v2 = $arr[$k2];
if($sum+$v2 > $target) continue;
$sum += $v2;
$parts[$k2] = $v2;
if($sum==$target) return array_keys($parts);
}
shuffle($keys);
}
}
return false;
}
有限搜索(在这种情况下是 2 或 3 个数字的组合):
function get_parts($arr,$target)
{
foreach($arr as $k => $v)
{
if($v>$target) continue;
foreach($arr as $k2 => $v2)
{
if($v2>$target) continue;
if($k2==$k) continue;
if($v + $v2 == $target)
{
return array($v,$v2);
}
foreach($arr as $k3 => $v3)
{
if($v3>$target) continue;
if($k3==$k2 || $k3==$k) continue;
if($v + $v2 + $v3 == $target)
{
return array($k,$k2,$k3);
}
}
}
}
return false;
}