Нужна реализация функции ** php.суть такая, Есть массив напр: $ar['310']=0.5;...

0 голосов
66 просмотров

Нужна реализация функции на php.
суть такая, Есть массив напр:
$ar['310']=0.5;
$ar['311']=0.375;
$ar['312']=0.1;
В массиве может быть как больше так и меньше элементов, необходимо высчитать все различные комбинации сумм элементов, чтобы в результате получилось число 1.5.
В данном примере должно получится
0.5+0.5+0.5=1.5
0.5+0.5+0.1+0.1+0.1+0.1+0.1=1.5
0.5+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1=1.5
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0. 1+0.1+0.1=1.5
0.375+0.375+0.375+0.375=1.5

Нужно написать функцию, на входе в которую будет передаваться массив значений и число 1.5 (может быть любое другое), а на выходе массив элементов с ключами, которые мы передали вначале.
на выходе в общем должно получиться что-то типо такого
$arr[0]="310,310,310"
$arr[0]="310,310,312,312,312,312,312"
$arr[0]="310,312,312,312,312,312,312,312,312, 312 ,312"
$arr[0]="312,312,312,312,312,312,312,312,312, 312 ,312,312,312,312,312"
$arr[0]="311,311,311,311"


Информатика (45 баллов) | 66 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

<?php<br>  $result = array();
  $arr = array ('310'=>0.5, '311'=>0.375, '312'=>0.1);
  
  function rec($str) {
    $sum = 0;
    foreach ($str as $i) #Вычисляем уже имеющуюся сумму
      $sum += $GLOBALS["arr"][$i];
    if ($sum == 1.5)
      $GLOBALS["result"][] = $str;
    if ($sum > 1.5) return;
    foreach ($GLOBALS["arr"] as $key=>$value) {
      $hello = $str; #Не знаю, насколько это легально, но заработало только так...
      $hello[] = $key;
      rec($hello);
    }
  }
  
  if (min(array_values($arr)) <= 0) die(); #Бесконечнная рекурсия должна быть предотвращена<br>  rec(array());
  
  foreach ($result as &$value) #Переделываем массив массивов в массив строк
    $value = implode(', ', $value);
  unset($value);
  
  print_r($result);
?>

(16.9k баллов)
0

а как бы теперь оформить это в виде одной функции, чтобы любые значения подставлять можно было?

0

Ну, любое - это как посмотреть...
<?php<br> $result = array();
$arr1 = array ('310'=>0.5, '311'=>0.375, '312'=>0.1);

function rec($str, $arr, &$rez) {
$sum = 0;
foreach ($str as $i) #Вычисляем уже имеющуюся сумму
$sum += $arr[$i];
if ($sum == 1.5)

0

$GLOBALS["result"][] = $str;
if ($sum > 1.5) return false;
foreach ($arr as $key=>$value) {
$hello = $str; #Не знаю, насколько это легально, но заработало только так...
$hello[] = $key;
rec($hello, $arr, $rez);
}
}

0

if (min(array_values($arr1)) <= 0) die(); #Бесконечнная рекурсия должна быть предотвращена<br> rec(array(), $arr1, $result);

foreach ($result as &$value) #Переделываем массив массивов в массив строк
$value = implode(', ', $value);
unset($value);

print_r($result);
?>

0

а вот что то типо этого как правильно реализовать?

число 1

число 2

число 3

число 4

число 5

сумма


0

<?php<br>$ar=array();
$ar[1]=$_POST['num1'];
$ar[]=$_POST['num2'];
$ar[]=$_POST['num3'];
$ar[]=$_POST['num4'];
$ar[]=$_POST['num5'];
$ar[]=$_POST['sum'];
function summa($num1,$num2,$num3,$num4) {

0

function rec($str) {
$sum = 0;
foreach ($str as $i) #Вычисляем уже имеющуюся сумму
$sum += $GLOBALS["arr"][$i];
if ($sum == $num4)
$GLOBALS["result"][] = $str;
if ($sum > $num4) return;
foreach ($GLOBALS["arr"] as $key=>$value) {
$hello = $str; #Не знаю, насколько это легально, но заработало только так...
$hello[] = $key;
rec($hello);
}
}

0

if (min(array_values($arr)) <= 0) die(); #Бесконечнная рекурсия должна быть предотвращена<br> rec(array());

foreach ($result as &$value) #Переделываем массив массивов в массив строк
$value = implode(', ', $value);
unset($value);
print_r($result);
return;
}
function summa($ar);

?>

0

не работает чего-то(