
最佳答案
讨论数量:
对于原题,如果数字仅限正整数的话,那用 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]));
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];
}