算法问题:PHP实现一个函数,判断一个数组是否能分割成两个元素之和相等的数组

例 [1,2,6,3]可以分成[1,2,3]和[6]

引申判断一个数组是否能分割成n个元素之和相等的数组

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案
function demo (array $arr)
    {
        if (empty($arr)) return 0;
        $len = count($arr);
        $sum = 0;
        for ($i = 0; $i < $len; $i++) {
            $sum += $arr[$i];
        }
        if ($sum % 2 == 1) {
            return 0;
        }
        $sum /= 2;
        $dp = [];
        for ($i = 0; $i < $sum + 1; $i ++) {
            array_push($dp, false);
        }
        $dp[0] = true;
        for ($i = 0; $i < $len; $i ++) {
            for ($j = $sum; $j >= $arr[$i]; $j --) {
                $dp[$j] |=  $dp[$j - $arr[$i]];
            }
        }
        return $dp[$sum];
    }
1年前 评论
讨论数量: 4

对于原题,如果数字仅限正整数的话,那用 max 把最大值拿出来,然后求和,最后 diff 掉就可以了。如果不是是允许负数的话,那就另外再解了

<?php

function foo(array $arr)
{
    $max = max($arr);

    $check = (array_sum($arr) - $max) === $max;
    if (!$check) {
        return false;
    }

    $first = array_diff($arr, [$max]);
    $last = [$max];
    return [$first, $last];
}

var_dump(foo([1, 3, 4, 6]));
var_dump(foo([1, 2, 6, 3]));
var_dump(foo([1, 2, 3, 4, 10]));

function foo2(array $arr)
{
    sort($arr);

    $max = array_pop($arr);
    if (array_sum($arr) === $max) {
        return [$arr, $max];
    }

    return false;
}

var_dump(foo2([1, 3, 4, 6]));
var_dump(foo2([1, 2, 6, 3]));
var_dump(foo2([1, 2, 3, 4, 10]));
1年前 评论
怎样的心 (楼主) 1年前
Rache1 (作者) 1年前
function demo (array $arr)
    {
        if (empty($arr)) return 0;
        $len = count($arr);
        $sum = 0;
        for ($i = 0; $i < $len; $i++) {
            $sum += $arr[$i];
        }
        if ($sum % 2 == 1) {
            return 0;
        }
        $sum /= 2;
        $dp = [];
        for ($i = 0; $i < $sum + 1; $i ++) {
            array_push($dp, false);
        }
        $dp[0] = true;
        for ($i = 0; $i < $len; $i ++) {
            for ($j = $sum; $j >= $arr[$i]; $j --) {
                $dp[$j] |=  $dp[$j - $arr[$i]];
            }
        }
        return $dp[$sum];
    }
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!