84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
需要一个php算法,选出一串数组中的数字组合相加和要最接近(<=)给定值的算法。
例如 :上限值:38 给定数组值 15,20,10, 6正确结果选定:20 10 6这个要如何实现?求具体实现方式之前是按从大到小排序,再相加,发现选出 20 15 10,但是其实最优的是20 10 6,求帮助。。。
认证0级讲师
<?php$a = 38;$arr = array(15,20,10,6);function ss($a,$arr){
$count = count($arr); $array = array(); for($i=0;$i<$count;$i++){ $r = $arr[$i]; unset($arr[$i]); $sum = abs(array_sum($arr) - $a); $array[$sum][] = $arr; $arr[] = $r; } return $array;
}$dd = ss($a,$arr);ksort($dd);print_r($dd);
打印,绝对值最小的,最靠近
Array(
[2] => Array ( [0] => Array ( [1] => 20 [2] => 10 [3] => 6 ) ) [3] => Array ( [0] => Array ( [3] => 6 [4] => 15 [5] => 20 ) ) [7] => Array ( [0] => Array ( [2] => 10 [3] => 6 [4] => 15 ) [1] => Array ( [4] => 15 [5] => 20 [6] => 10 ) )
)
最先想到的肯定是暴力for循环算法,这个时间复杂度有点高,在n^2,少量数据可以实现的。
结果是 20 15 10 和明显小于38了啊,if判断就可以筛选掉,不可能一次性就给你选出最优,除非刚好。
算法的话可以划分到动态规划里面去,核心也是for循环,很类似。
这是经典背包问题,推荐阅读 背包问题九讲
利用了动态规划求解01背包问题的方法
$maxSize = 38; $arr = array(15, 20, 10, 6); $result = array(); $answers = array(); $currSize = 36; $len = count($arr); for ($i = 0; $i < $len; $i++) { $result[] = array(); for ($j = 0; $j <= $maxSize; $j++) { $result[$i][$j] = 0; } } for ($i = 0; $i <= $maxSize; $i++) { for ($j = 0; $j < $len; $j++) { if ($arr[$j] > $i) { if ($j === 0) $result[$j][$i] = 0; else $result[$j][$i] = $result[$j - 1][$i]; } else { if ($j === 0) $result[$j][$i] = $arr[$j]; else $result[$j][$i] = max($result[$j - 1][$i], $result[$j - 1][$i - $arr[$j]] + $arr[$j]); } } } // 找出答案 for ($i = $len - 1; $i >= 0 && $currSize !== 0; $i--) { if ($result[$i][$currSize] - $result[$i - 1][$currSize - $arr[$i]] === $arr[$i]) { $answers[] = $arr[$i]; $currSize -= $arr[$i]; } }
求助,求助~update
楼主,弄出来了吗?
<?php
$a = 38;
$arr = array(15,20,10,6);
function ss($a,$arr){
}
$dd = ss($a,$arr);
ksort($dd);
print_r($dd);
打印,绝对值最小的,最靠近
Array
(
)
最先想到的肯定是暴力for循环算法,这个时间复杂度有点高,在n^2,少量数据可以实现的。
结果是 20 15 10 和明显小于38了啊,if判断就可以筛选掉,不可能一次性就给你选出最优,除非刚好。
算法的话可以划分到动态规划里面去,核心也是for循环,很类似。
这是经典背包问题,推荐阅读 背包问题九讲
利用了动态规划求解01背包问题的方法
求助,求助~update
楼主,弄出来了吗?