PHP 如何递归算法?
题目
有一个数组,由30个1~999键值组成,和为 12865,请写出计算此数组的 30 个值的方法
$arr[1]+$arr[2]+....+$arr[30]=12865
回答
如何把以下代码简化,因为 $i ~ $iN 是不确定的。如果有其他算法更好
function loopDeep($sum , $count, $min, $max)
{
for ($i = $min; $i < $max; $i++) {
for ($i2 = $min; $i2 < $max; $i2++) {
for ($i3 = $min; $i3 < $max; $i3++) {
for ($i4 = $min; $i4 < $max; $i4++) {
if ($i + $i2 + $i3 + $i4 == $sum) {
return [$i, $i2, $i3];
}
}
}
}
}
return [];
}
2015-8-23 一种算法,查看分布。(by CSDN某大牛)
$r = foo(12865, 30);
echo array_sum($r), PHP_EOL; //验证总和
print_r(array_count_values($r)); //查看分布
function foo($num, $k, $min = 1, $max = 999)
{
$res = array_fill(0, $k, 1);
do {
for ($i = 0; $i < $k; $i++) {
$sum = array_sum($res);
$t = rand(0, $max - $min);
if ($res[$i] + $t > $max) $t = $max - $res[$i];
if ($sum + $t > $num) $t = $num - $sum;
$res[$i] += $t;
}
} while ($num > $sum);
return $res;
}
12865
Array
(
[222] => 2
[589] => 1
[127] => 1
[538] => 1
[268] => 1
[444] => 1
[922] => 1
[537] => 1
[211] => 1
[17] => 1
[848] => 1
[800] => 1
[893] => 1
[274] => 1
[499] => 1
[45] => 1
[660] => 1
[686] => 1
[968] => 1
[491] => 1
[355] => 1
[849] => 1
[857] => 1
[322] => 1
[217] => 1
[1] => 4
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
正准备睡觉,瞬间有了思路。。。
先来个js版本的---我是前端(:
php:
刚刚用node跑了一下,没跑完(复杂度太大),也不知道对不对,谁跑完结果告诉我一下(:
可以睡觉去了。。。
用测试数据0,1,2,3跑了一下
[0,1,2,3]取3个数字,和为6;
dp方案
dp, 只用一维数组节省内存, 但是题目复杂度太大... 不玩了.
dp方案2
二维数组, 太费内存
递归方案
Java代码. 用了一些优化提高效率, 但复杂度还是太高. 权当参考吧.
题目意思比较含糊,没说要所有结果还是只要一组还是搜索特定结果;
只要一组,数字可以重复的话,29个1加一个12836就可以了;
只要一组数字,数字要求不重复,随机生成29个,sum超过12865和重复数字的回退,最后一个用12865减掉前面29个值;
如果搜索给定的数组的话,直接DFS吧;
如果是求出所有可能结果,那就BFS吧。