gpt4 book ai didi

PHP:数字数组可以加起来为数字吗

转载 作者:可可西里 更新时间:2023-11-01 12:38:19 25 4
gpt4 key购买 nike

这比任何事情都更像是一个谜题。我实际上找到了解决方案,但它太慢了,我以为我失去了互联网连接(见下文)。

问题是:

假设我有一个数字数组,如下所示:

$numbers_array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

假设我有一些数字,存储在这样的变量中:

$sum = 15;
$sum2 = 24;
$sum3 = 400;

我正在尝试创建一个函数,如果可以将 $numbers_array 中的任何数字加在一起(每个数字仅使用一次)以形成总和,该函数将返回 true:

function is_summable($array_of_nums, $sum_to_check) {
//What to put here?
}

var_dump(is_summable($numbers_array, $sum));
var_dump(is_summable($numbers_array, $sum2));
var_dump(is_summable($numbers_array, $sum3));

上面应该输出:

bool(true)
bool(true)
bool(false)

因为 7 + 8 = 15,7 + 8 + 9 = 24,但是 1-9 的组合不能创造 200。

这是我极其缓慢的解决方案:

function is_summable($numbers, $sum) {
//Sort provided numbers and assign numerical keys.
asort($numbers);
$numbers = array_values($numbers);

//Var for additions and var for number of provided numbers.
$total = 0;
$numbers_length = count($numbers);

//Empty var to fill below.
$code = '';

//Loop and add for() loops.
for ($i = 0; $i < $numbers_length; $i++) {
$code .= 'for ($n' . $i . ' = 0; $n' . $i . ' < ' . $numbers_length . '; $n' . $i . '++) {';

if ($i != 0) {
$code .= 'if ($n' . $i . ' != $n' . ($i - 1) . ') {';
}

$code .= '$total += intval($numbers[$n' . $i . ']);';
$code .= 'if ($total == $sum) {';
$code .= 'return true;';
$code .= '}';
}

//Add ending bracket for for() loops above.
for ($l = 0; $l < $numbers_length; $l++) {
$code .= '$total -= intval($numbers[$n' . $i . ']);';
if ($l != 0) {
$code .= '}';
}
$code .= '}';
}

//Finally, eval the code.
eval($code);

//If "true" not returned above, return false.
return false;
}

$num_arr = array(1,2,3,4,5,6,7,8,9);
var_dump(is_summable($num_arr, 24));

http://pastebin.com/1nawuwXK

一如既往,感谢帮助!

最佳答案

您的问题实际上是标准算法问题(如 Jon 提到的背包问题),更具体地说是 Subset sum problem .它可以在多项式时间内解决(查看 wiki page )。

伪代码:

initialize a list S to contain one element 0.
for each i from 1 to N do
let T be a list consisting of xi + y, for all y in S
let U be the union of T and S
sort U
make S empty
let y be the smallest element of U
add y to S
for each element z of U in increasing order do
//trim the list by eliminating numbers close to one another
//and throw out elements greater than s
if y + cs/N < z ≤ s, set y = z and add z to S
if S contains a number between (1 − c)s and s, output yes, otherwise no

关于PHP:数字数组可以加起来为数字吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11932220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com