Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP函数或算法,用于查找数组中哪些元素的总和正好等于某个数字_Php_Arrays_Algorithm_Sorting - Fatal编程技术网

PHP函数或算法,用于查找数组中哪些元素的总和正好等于某个数字

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),但不是第一个,所以我们可以忽略它们。 函数应该返回一个

嗨,我正在寻找一个算法或函数,以找出数组中的元素组加起来是一个特定的数字。可能有多个,因此我希望返回数组中从左到右的第一个良好组读数

例如,假设我有一个随机数数组$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)


感谢您的帮助!谢谢:-)

好吧,我可能错过了一个“正确”的方法,但我还是有一些解决办法

无限搜索-尝试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;
}