PHP函数或算法,用于查找数组中哪些元素的总和正好等于某个数字
嗨,我正在寻找一个算法或函数,以找出数组中的元素组加起来是一个特定的数字。可能有多个,因此我希望返回数组中从左到右的第一个良好组读数 例如,假设我有一个随机数数组$x=array(500,90,50,200,10,300,900)我想识别任何一组数组元素,它们加起来等于给定的数字x,比如1000 在本例中,数组$x的元素0,3,5是第一个加起来为1000(500+200+300)的元素。元素1、4、6加起来也是1000(90+10+900),但不是第一个,所以我们可以忽略它们。 函数应该返回一个新数组,该数组的索引位置正确$y=array(0,3,5)PHP函数或算法,用于查找数组中哪些元素的总和正好等于某个数字,php,arrays,algorithm,sorting,Php,Arrays,Algorithm,Sorting,嗨,我正在寻找一个算法或函数,以找出数组中的元素组加起来是一个特定的数字。可能有多个,因此我希望返回数组中从左到右的第一个良好组读数 例如,假设我有一个随机数数组$x=array(500,90,50,200,10,300,900)我想识别任何一组数组元素,它们加起来等于给定的数字x,比如1000 在本例中,数组$x的元素0,3,5是第一个加起来为1000(500+200+300)的元素。元素1、4、6加起来也是1000(90+10+900),但不是第一个,所以我们可以忽略它们。 函数应该返回一个
感谢您的帮助!谢谢:-)好吧,我可能错过了一个“正确”的方法,但我还是有一些解决办法 无限搜索-尝试2(推荐): 尝试无限搜索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;
}
这就是所谓的问题,一般来说,它无法在合理的时间内解决。当然,对于如此小的输入,你可以强行执行。问题是人类可以智能地解决这个问题,即使你可以让算法像人类一样思考这样的计算,程序也不会放弃,因为人类很快就会意识到没有正确的组合。换句话说,当你有一组没有解的数字时,程序所做的任何尝试实际上都是蛮力。有最大值吗?例如1到4个数字之间,或任何大于1的元素集合?另外,如果目标是10,你会得到10的匹配吗?还是没有结果?@Flosculus:“人类很快就会意识到没有正确的组合”=>而人类将是错误的。你可以在头脑中解决这个问题的案例非常简单,你的手机在你读取数字的时间内可以解决它们上千次。@Flosculus:当然,如果你想让他们停下来想“这太耗时了”。)。无论如何,这是一个与最初的“人类会意识到没有正确的组合”完全不同的主题——人类在这类工作中实际上是无用的。更准确的说法是“一个人会意识到除了纯粹的运气,他们没有办法找到解决方案,几分钟后就放弃了”。很酷,这个解决方案可以在1到2次有限搜索中获得零件,我可以在我的程序中使用它。谢谢,这是一个很好的解决方案。在get_parts2中,我想您会重复数字,所以我可以添加一些代码来尝试区分它们。。。但是很好的代码。。。感谢:-)@ConorRyan别担心,get_Parts 3通常比get_Parts 2好,但我把它放在那里作为备用解决方案,以备不时之需。@ConorRyan如果这已经回答了你的问题,请记住通过接受答案将问题标记为已解决(单击投票箭头下的勾号)@SmokeyHP Hi,我找到了您的代码,因为我需要它完全执行它的功能,但我在试图理解它时遇到了困难,当它变得疯狂时,是get_parts3的最后一部分,$tmparr=$arr;$tmparr[$k]=$target+1;$test=get_parts3($tmparr,$target-$v);如果(is_array($test)){echo“Returneo
;return array_merge(array($k),$test);}为什么要在目标中添加1,以及如何在函数中调用函数,我不知道这是可能的。Return false不结束函数,介意解释一下吗?我通常能理解任何代码,但这超出了我的理解能力。@SmokeyHP Nvm man,我只是一直盯着它看,一遍又一遍地看,并设法完全理解它,谢谢你的代码!
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;
}
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;
}