$arr = array(29,24.66,36.52,19.75,14.61,45,23.65,16.51,7.28,2.67,1.68,45,0.24,405,180,105);
求通过PHP,找出数组中1个或多个数值的和为 指定值的方法
计算上面数组中多个值的相加 ,如 29+24.66 24.66+105+0.24+1.68+2.67 .....直到找出和为690 式子
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
/**
* 根据某个值对数组中的元素进行分组
*/
function getGroupBySum($arr, $sum) {
$len = count($arr);
$result = [];
// for 1
for($i = 0; $i < $len; $i++) {
// for 2
for($j = 1; $j < $len - $i; $j++) {
$tmp = array_slice($arr, $i+1, $j);
array_unshift($tmp, $arr[$i]);
if(array_sum($tmp) == $sum) {
$result[] = $tmp;
}
}
//for 3
for($k = $i + 1; $k < $len; $k++) {
if(($arr[$i] + $arr[$k]) == $sum) {
$result[] = [$arr[$i], $arr[$k]];
}
}
}
return $result;
}
print_r(getGroupBySum($arr, 10));
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
[1] => Array
(
[0] => 1
[1] => 9
)
[2] => Array
(
[0] => 2
[1] => 8
)
[3] => Array
(
[0] => 3
[1] => 7
)
[4] => Array
(
[0] => 4
[1] => 6
)
)
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
/**
* 根据某个值对数组中的元素进行分组
*/
function getGroupBySum($arr, $sum) {
$len = count($arr);
$result = [];
// for 1
for($i = 0; $i < $len; $i++) {
// for 2
for($j = 1; $j < $len - $i; $j++) {
$tmp = array_slice($arr, $i+1, $j);
array_unshift($tmp, $arr[$i]);
if(array_sum($tmp) == $sum) {
$result[] = $tmp;
}
}
//for 3
for($k = $i + 1; $k < $len; $k++) {
if(($arr[$i] + $arr[$k]) == $sum) {
$result[] = [$arr[$i], $arr[$k]];
}
}
}
return $result;
}
print_r(getGroupBySum($arr, 10));
打印结果:
Array(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
[1] => Array
(
[0] => 1
[1] => 9
)
[2] => Array
(
[0] => 2
[1] => 8
)
[3] => Array
(
[0] => 3
[1] => 7
)
[4] => Array
(
[0] => 4
[1] => 6
)
)
函数getGroupBySum的算法解释:
我只能解释到这里了,剩下的只可意会。
---------------------------2017/2/16/19:45--------------
下班回去的途中,仔细思考了一下,我上面的函数还没有找到 1、2、7与1、3、6等等,所以它是错的。
我对题目的理解是:数组中任意个元素的和等于某个值,把这些元素组合找出来。
如果没有理解错题意的话,我写不出来这种算法,组合太多了。
昨天 我也是大概这样写的, 用第一个数加 后面的数,再用第2个数加后面的数 ,以此类推
但正如你所说的,这样的算法是有问题的....我再想想办法 。
谢谢!
温馨提示:答案为网友推荐,仅供参考
第1个回答 2017-02-16
先随机取出数组里的元素组成一个新的数组,用新数组进行遍历相加即可。需要写代码吗?追问
麻烦写下代码 吧,谢谢