如果不改变下面的天真算法,我应该更改什么才能使代码对内存的影响更小? (该算法旨在解决项目euler问题31 link
我认为我的算法可以工作,因为当最大总和为100时,它会给出正确的答案。
当我尝试运行下面的代码为200时,内存不足。下面的代码并不意味着仅仅是算法的简单实现。我不明白为什么下面这个不能成功,最大总和= 200,因为答案不够大,不能强大(google)。我想我正在做一些非常糟糕的礼仪,我发布这个希望有人可以指出这一点,并且可能会给他们实现算法的方式。
<?php
$coinSet = array(200,100,50,20,10,5,2,1);
$coinCombo = array();
$sum_max = 100;
$test = array($sum_max);
$counter = 0;
function isValid($array){
global $sum_max;
if (array_sum($array) > $sum_max) {return (FALSE);}
return (TRUE);
}
function isComplete($array){
global $sum_max;
if (array_sum($array) == $sum_max) {return (TRUE);}
return (FALSE);
}
function split($array){
global $coinSet;
$array = array_filter($array, function($n) {return ($n > 1);});
$element = array_search(end($array), $coinSet);
$array[key($array)] = $coinSet[$element+1];
reset($array);
return $array;
}
function addElement($array){
$array[] = end($array);
return $array;
}
function solver($array){
global $sum_max;
global $coinCombo;
global $counter;
if (count($array) == $sum_max) { $counter++; return; }
if (isComplete($array)) { $counter++; $array = split($array); }
if (!isValid($array)) { $array = split($array); }
if (isValid($array) & !isComplete($array)) { $array = addElement($array); }
solver($array);
}
solver(array($sum_max));
print_r($counter);
?>
答案 0 :(得分:0)
似乎修改函数内的数组会复制数组。由于您使用大小为200的数组多次执行此操作,因此很快就会对您的记忆产生负担。解决方案可能是在函数描述中使用引用运算符&
:split(& $array)
。但是,我当然建议你尝试使用动态编程来减少这个硬币更改问题,如果这还不够,可能会放弃部分记忆。