нужна реализация функции на 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"
Answers & Comments
$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(); #Бесконечнная рекурсия должна быть предотвращена
rec(array());
foreach ($result as &$value) #Переделываем массив массивов в массив строк
$value = implode(', ', $value);
unset($value);
print_r($result);
?>
<form action="" method="POST">
число 1<input type="text" name="num1"><br>
число 2<input type="text" name="num2"><br>
число 3<input type="text" name="num3"><br>
число 4<input type="text" name="num4"><br>
число 5<input type="text" name="num5"><br>
сумма <input type="text" name="sum"><br>
<input type="submit" name="submit" value="найти комбинации"><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) {
$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);
}
}
rec(array());
foreach ($result as &$value) #Переделываем массив массивов в массив строк
$value = implode(', ', $value);
unset($value);
print_r($result);
return;
}
function summa($ar);
?>