Php 如何从该数组中获取所需的和

Php 如何从该数组中获取所需的和,php,Php,这是我目前拥有的代码: $required = 1.3; $stacks = 0; $remaining = $required; $whichtakes = []; $array_result = ['0.6', '0.5', '0.8', '0.7']; for($i = 0; $i < count($array_result); $i++) { if($array_result[$i] <= $required && $stacks + $array_

这是我目前拥有的代码:

$required = 1.3;
$stacks = 0;
$remaining = $required;
$whichtakes = [];
$array_result = ['0.6', '0.5', '0.8', '0.7'];
for($i = 0; $i < count($array_result); $i++) {
    if($array_result[$i] <= $required  && $stacks + $array_result[$i]  <= $required) {
        $stacks += $array_result[$i];
        echo $remaining -= $array_result[$i];
        $whichtakes[] = $array_result[$i];
    }
}
print_r($whichtakes);
这仅获取0.6和0.5(前两个值),并给出剩余值(总和为1.1,因此剩余0.2)。但是输入有两个值,其总和与my
$required
值匹配:0.8和0.7


如何改进我的代码,使其能够找到这些值?如果没有可能的精确匹配,我希望得到一系列值,其总和尽可能接近,从而最小化剩余值。

此算法将找到所有与
$required
值相加的对:

$required = 1.3;
$array_result = ['0.6', '0.5', '0.8', '0.7'];

$answers = [];
foreach ($array_result as $value) {

    $remaining = $required - $value;
    if (in_array((string)$remaining, $array_result)) {
        $new_answer = ($value <= $remaining ? [$value, $remaining] : [$remaining, $value]);
        $answers[] = $new_answer;
    }
}

echo '<pre>';
print_r(array_unique($answers, SORT_REGULAR));
echo '</pre>';

在注释中进行了更多解释之后,结果表明您希望找到此输入/输出的算法:

输入:

  • 总金额,以及
  • 包含数量的数组
输出:

  • “最近子集”:从输入数组(不一定是一对)中选择的数量,其最大和不大于给定总量
  • 该子集之和与给定总额之间的差额
您可以通过以下方式实现这一点:

生成所有组合,由它们生成的和(或余数)键控,但当它们的和太大时停止添加元素。这可以通过对元素进行简单的迭代和更新散列来完成,散列由通过将值添加到以前找到的和中找到的和(或余数)键控

这看起来是这样的:


你的问题不清楚(至少对我来说)。期望的结果是什么?0.8+0.7==1.5,你为什么说这些值与你的
$required
==1.3精确匹配?你的标题提到了“最近的对”,但你的代码或描述中没有任何内容与查找最近的对有关。注意:你应该正确缩进你的代码。你永远不会重置循环中
$stacks
$remaining
的值。您的算法将不起作用。对不起,先生,它的工作非常完美,但没有什么变化,您的算法正在获得对,但我想要匹配我的结果数组的数组,只需要这一点变化。如果$required=1.3改为$required=1.8,现在应该给我数组0.6,0.5,0.7,如果$required=1.9,现在应该给我数组0.6,0.5,0.7和0.1剩余如果$required=0.5;和$array_result=[1];如果($whichtakes=0.5,重命名为0.5,而$whichtakes中没有任何内容,那么我认为它必须给我$whichtakes=0.5,重命名为0.5,如果($remaining>=$val)中的条件不成立,我们需要一个else语句吗??请指导我认为您最初的问题是,
$whichtakes
应该从数组中获取值,因此在您的示例中它永远不可能是0.5:
$array\u result
只有值1。是的,从数组中获取值,但它可以是数组中的一个结果,我正在使用从arrayelse if($剩余)获得的一个结果进行测试
$required = 1.3;
$array_result = ['0.6', '0.5', '0.8', '0.7'];

$answers = [];
foreach ($array_result as $value) {

    $remaining = $required - $value;
    if (in_array((string)$remaining, $array_result)) {
        $new_answer = ($value <= $remaining ? [$value, $remaining] : [$remaining, $value]);
        $answers[] = $new_answer;
    }
}

echo '<pre>';
print_r(array_unique($answers, SORT_REGULAR));
echo '</pre>';
Array
(
    [0] => Array
        (
            [0] => 0.6
            [1] => 0.7
        )

    [1] => Array
        (
            [0] => 0.5
            [1] => 0.8
        )

)
// Input
$required = 1.3;
$array_result = [0.6, 0.5, 0.8, 0.7];

// Algorithm
$remainings = [(string)$required => []]; // Keyed by remaining value; gives array elements that have that remainder

foreach($array_result as $i => $val) {
    foreach($remainings as $remaining => $whichtakes) {
        if ($remaining >= $val) $remainings[(string)($remaining-$val)] = array_merge($whichtakes, [$val]);
    }
}
$remaining = min(array_keys($remainings));
$whichtakes = $remainings[(string)$remaining];

// Output
print_r($whichtakes);   // [0.6, 0.7]
print_r($remaining);    // 0