Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou quebrando a cabeça para desenvolver um script que faz o seguinte:
Recebe um array contendo floats e um número inteiro e verifica qual a provável e menor soma de dos itens do array e seus múltiplos para chegar ao valor do inteiro.
Trocando em miúdos, é como se eu tivesse um array contendo os valores 4.0 - 3.8 - 9.4 - 1.1 - 1.2 - 7.5 - 1.5 e quisesse obter a menor soma provável para chegar ao valor 86. No caso seria 75+11. O problema é que o computador pode "pensar" em fazer a soma de 40+12+12+11+11, que daria o mesmo resultado, mas a soma é maior que a primeira.
Difícil implementar né? Minha matemática não está muito boa ueuheuhehu
Bom eu dei uma iniciada fazendo o seguinte:
<?php
$r = '24';
$n = (int)$r;
$r = strrev($r);
$leng = strlen($r);
$comvals = array(1.0,1.1,1.2,1.3,1.5,1.6,1.8,2.0,2.2,2.4,2.7,3.0,3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1);
$resarr = array();
$resarrs = array();
function mult (&$item, $key, $fc) {
$item=$item*$fc;
}
function near($value, $array)
{
if (count($array) == 1) return $array[0];
sort($array);
$index = floor(count($array) / 2);
if ($array[$index] == $value) return $value;
if ($value < $array[$index]) {
return near($value, array_slice($array, 0, $index));
}
if ($value > $array[$index])
return near($value, array_slice($array, $index));
}
for ($x = 0; $x <=$leng-1; $x++) {
$factor = pow(10, $x);
if (($x % 2 != 0)) {
$v = ((int)$r[$x]*$factor)+((int)$r[$x-1]*pow(10,$x-1));
$narr = $comvals;
array_walk($narr, "mult", $factor);
$val = near($v,$narr);
$resarrs[$x] = " 1 vezes o valor de ".$val;
$n = $n-$val;
}
}
$r = (string)$n;
$r = strrev($r);
$leng = strlen($r);
for ($x = 0; $x <=$leng-1; $x++) {
$factor = pow(10, $x);
$v = (int)$r[$x]*$factor;
if ($v == 0) continue;
for ($y = count($comvals)-1; $y >=0; $y--) {
$ret = 0;
for ($z = 0; $z < 50; $z++) {
$ret = $z*$factor*$comvals[$y];
if ($ret == $v) {
$resarr[$x] = " ".$z." vezes o valor ".($comvals[$y]*$factor)." ";
break;
}
elseif ($ret > $v) break;
}
if (!empty($resarr[$x])) break;
}
}
print_r($resarrs);
print_r($resarr);
?>
Está meio desorganizado. Bom, ele funciona com valores R de 9324 por exemplo, ou o valor 36, ou 50 e por aí vai. Mas quando eu coloco um 180, ele já não funciona perfeitamente. É justamente pela lógica do meu algorítimo.
Se for mais fácil ao invés de mostrar só a menor possibilidade, poderia mostrar todas elas.
Alguém me dá uma luz aí? Obrigado pessoal!
Eita negócio esquisito.
Fiz uma coisinha aqui... Dá uma olhada se seria isso:
<?php
$target = 8.6; // 3.9 + 1.5
// Remove os valores menores que o alvo
$list = array_filter(
$list,
// Ordena Crescentemente
sort( $list );
// Calcula a diferença
/**
* https://bugs.php.net/bug.php?id=46781
*/
$margin = (float) bcsub( $diff, $closest );
printf(
Testei com dois números:
8.6 e ele encontrou o 1.1
5.4, tendo em mente 3.9, ele encontrou 1.5. Porém existe aí uma margem de erro de 0.1, mas pelo menos meu output gerou zero de diferença. o.O