我需要从给定数组计算出与PHP中给定数字相等或更高且最接近的数字。例如:
要获取的数字:
6.85505196
要计算的数组:
3.11350000
4.38350000
4.04610000
3.99410000
2.86135817
0.50000000
只有正确的组合应该是:
3.99410000 + 2.86135817 = 6.85545817
有人能帮助我吗?已经3个小时我生气了!
更新:我最终完成了以下代码:
$arr = array(3.1135, 4.3835, 4.0461, 3.9941, 2.86135817, 0.5);
$fetch = 6.85505196;
$bestsum = get_fee($arr, $fetch);
print($bestsum);
function get_fee($arr, $fetch) {
$bestsum = 999999999;
$combo = array();
$result = array();
for ($i = 0; $i<count($arr); $i++) {
combinations($arr, $i+1, $combo);
}
foreach ($combo as $idx => $arr) {
$sum = 0;
foreach ($arr as $value) {
$result[$idx] += $value;
}
if ($result[$idx] >= $fetch && $result[$idx] < $bestsum) $bestsum = $result[$idx];
}
return $bestsum;
}
function combinations($arr, $level, &$combo, $curr = array()) {
for($j = 0; $j < count($arr); $j++) {
$new = array_merge($curr, array($arr[$j]));
if($level == 1) {
sort($new);
if (!in_array($new, $combo)) {
$combo[] = $new;
}
} else {
combinations($arr, $level - 1, $combo, $new);
}
}
}
答案 0 :(得分:3)
我希望以下示例可以帮助您。请试试这个
<?php
$array = array(
"3.11350000",
"4.38350000",
"4.04610000",
"3.99410000",
"2.86135817",
"0.50000000"
);
echo "<pre>";
print_r($array);// it will print your array
for($i=0; $i<count($array); $i++)
{
$j=$i+1;
for($j;$j<count($array); $j++)
{
$sum = $array[$i] + $array[$j];
// echo $array[$i]. " + ".$array[$j]." = ".$sum."<br>"; //this will display all the combination of sum
if($sum >= 6.85505196 && ($sum <= round(6.85505196)) )//change the condition according to your requirement
{
echo "The correct combinations are:<br/><br/>";
echo "<b>". $array[$i]. " + ".$array[$j]." = ".$sum."<b>";
echo "<br/>";
}
}
echo "<br/>";
}
?>
我们将得到如下结果
Array
(
[0] => 3.11350000
[1] => 4.38350000
[2] => 4.04610000
[3] => 3.99410000
[4] => 2.86135817
[5] => 0.50000000
)
The correct combinations are:
4.04610000 + 2.86135817 = 6.90745817
3.99410000 + 2.86135817 = 6.85545817
答案 1 :(得分:2)
您应该分两步完成:
一个。找出(或查找)算法来完成这项工作。
湾实施它。
你不会说出你在这个工作的三个小时内所做的事情,所以这里有一个蛮力的&#34;&#34; (阅读:哑)算法将完成这项工作:
使用一个到目前为止保持最佳总和的变量。它可以从零开始:
$bestsum = 0;
尝试所有单个数字,然后是两个数字的所有总和,然后是三个数字的所有总和等:每当您找到符合您的标准的数字且是比当前$bestsum
更好,设置$bestsum
。同时将第二个变量$summands
设置为用于获得此结果的数字数组。 (否则你不会知道你是如何得到解决方案的)。每当您找到更好的解决方案时,请更新两个变量。
当您尝试了每个数字组合时,您的两个变量包含最佳解决方案。打印出来。
这就是全部。它保证正常工作,因为它尝试了所有可能性。有各种各样的细节需要填写,但是如果你遇到困难,你可以开始工作并在这里寻求特定任务的帮助。
答案 2 :(得分:0)
新的更新代码。
<?php
$x = 6.85505196;
$num = array(3.1135, 4.3835, 4.0461, 3.9941, 2.86135817, 0.5);
asort($num); //sort the array
$low = $num[0]; // lowest value in the array
$maxpossible = $x+$low; // this is the maximum possible answer, as we require the number that is equal or higher and closest to a given number
$num = array_values($num);
$iterations = $x/$num[0]; // possible combinations loop, to equate to the sum of the given number using the lowest number
$sum=$num;
$newsum = $sum;
$k=count($num);
for($j=0; $j<=$iterations; $j++){
$l = count($sum);
for($i=0; $i<$l; $i++){
$genSum = $sum[$j]+$sum[$i];
if($genSum <= $maxpossible){
$newsum[$k] = $genSum;
$k++;
}
}
$newsum = array_unique($newsum);
$newsum = array_values($newsum);
$k = count($newsum);
$sum = $newsum;
}
asort($newsum);
$newsum = array_values($newsum);
for($i=0; $i<count($newsum); $i++){
if($x<=$newsum[$i]){
echo "\nMaximum Possible Number = ".$newsum[$i];
break;
}
}
?>
答案 3 :(得分:0)
谢谢大家的帮助! 当需要获取一个或两个数字(添加)时,我的代码工作非常酷。但无法弄清楚如何添加更多组合,直到我给定数组中的元素总数。 我的意思是,如果有,我的阵列中有8个数字,我想尝试所有可能的组合(彼此相加)。 我的实际代码是:
$bestsum = 1000000;
for ($i = 0; $i < count($txinfo["vout"]); $i++) {
if ($txinfo["vout"][$i]["value"] >= $spent && $txinfo["vout"][$i]["value"] < $bestsum) {
$bestsum = $txinfo["vout"][$i]["value"];
}
}
for($i = 0; $i < count($txinfo["vout"]); $i++) {
$j = $i + 1;
for($j; $j < count($txinfo["vout"]); $j++) {
$sum = $txinfo["vout"][$i]["value"] + $txinfo["vout"][$j]["value"];
if($sum >= $spent && $sum < $bestsum) {
$bestsum = $sum;
}
}
}
$fee = bcsub($bestsum, $spent, 8);
print("Fee: ".$fee);