Как определить, сколько из каждого значения в столбце мне нужно добавить к общему значению в Excel? - PullRequest
0 голосов
/ 25 февраля 2019

Так сказать

A1 - A8 содержит значения 11, 120, 321, 435, 623, 765, 964, 1039, B1 Содержит значение 1375, как можно использовать формулу или макрос в Excel для работысколько потребуется, чтобы получить значение не менее B1

. В этом примере: A8 + A3 + A2 или A8 + A3 + A1 + A1

Есть ли способ сделать это??

Извините, что приведу еще один пример и проясню это немного.

У меня есть машина, которую я хочу купить за 35 000 долларов. У меня банкноты достоинством 10, 20, 100, 1000 и 10000 долларов, какие комбинации банкнот мне понадобятся, чтобы составить общую стоимость, используя наименьшее числоиз заметок.

Беглый взгляд на это сказал бы, что 3 х 10 000 долларов и 5 х 1 000 долларов были бы совершенно правильными, тогда как 4 х 10 000 долларов США были бы наименьшим числом счетов.Я хотел бы иметь возможность ввести любое значение и получить либо наименьшее количество счетов, либо точное совпадение, однако я думаю, что наименьшее количество счетов будет лучшим.

Уэс

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Хорошо, я выбрал неэффективный код для управления этим (в PHP, поскольку это была самая простая среда тестирования).

    $w=array();
    $a=7000;
    $a1=$a;
    $b=array(10,100,500,750);/*9 x 750 + 2 x 100 + 10 x 5*/
    $t=$b;
    $r=0;
    $z=0;

    while ($r==0){
        $z++;
        $num1=0;
        $num2=0;
        if (count($t)>0){
            $c=max($t);
            array_pop ($t); 
        }else{
            $r=1;
        }
        $i=0;
        $d=0;
        $q=0;
        $e=0;
        $j=0;
        while ($q==0){
            if ($c>$a1){
                $num2=$a1;
                $q=1;
            }else{
                $num1=$a1 / $c; 
                $num2=$a1 % $c;
                $q=2;
            }
        }   
        if (($a1>$c) and ($num2==0)){
            //echo "f<br>";//$r=1;
            $w[$z][0]=intval($num1);
            $w[$z][1]=$num2;
            $w[$z][2]=$q;
            $w[$z][3]=$c;
            $r=1;
        }else{
            $w[$z][0]=intval($num1);
            $w[$z][1]=$num2;
            $w[$z][2]=$q;
            $w[$z][3]=$c;
            $a1=$num2;
        }
    }


    foreach ($w as $ww){
        echo $ww[0]."|".$ww[3]."<br>";
    }

Так что это вывело бы

9 | 750

0 | 500

2 | 100

5 | 10

Первое число - это количество раз, которое значение массива входит в определенное значение.второе число - это значение массива.

Итак, 7000 = (9 x 750) + (2 x 100) + (5 x 10);

Нужно немного подумать, чтобы понять, что былонеобходимо.Буду рад любым предложениям по повышению эффективности кода!

0 голосов
/ 27 февраля 2019

Посмотрев это снова, он не совсем достиг уровня, которым я доволен, тем более, что я хотел бы взглянуть и на взвешивание, так что вот еще один вариант:

$w=array();
$dividend=455000000;
$remainder=$dividend;
$b=array(4100000,10000000,50000000,101000000);/*9 x 750 + 2 x 100 + 10 x 5*/
$b1=array(5,4.8,3.9,3.2);
$t=$b;
$r=0;
$y=0;
$z=count($t);
while ($z>0){
    $z--;
    $quotient=0;
    $remainder2=0;
    $divisor=$t[$z];
    $i=0;
    $d=0;
    $q=0;
    $e=0;
    $j=0;
    while ($q==0){
        if ($divisor>$remainder){
            $remainder2=$remainder;
            $q=1;
        }else{
            $quotient=$remainder / $divisor; 
            $remainder2=$remainder % $divisor;
            $q=2;
        }
    }   
    if ($remainder<$divisor){
        $w[$y][0]=intval($quotient);
        $w[$y][1]=$remainder2;
        $w[$y][2]=$q;
        $w[$y][3]=$divisor;
        $remainder=$remainder2;
    }else{
        if (($quotient>1) and ($z<count($t)-1)){
            $w[$y-1][0]++;
            $z=0;
            unset($w[$y]);
            $remainder2=0;
        }else{
            $w[$y][0]=intval($quotient);
            $w[$y][1]=$remainder2;
            $w[$y][2]=$q;
            $w[$y][3]=$divisor;
            $remainder=$remainder2;
        }

    }
    $y++;
}

if ($remainder2>0){
    $w[$y-1][0]++;
}


 $total=0;
 foreach ($w as $ww){
    echo $ww[0]."|".$ww[3]."<br>";
    $total+=$ww[0] * $ww[3];
}

echo $total."<br>";
0 голосов
/ 26 февраля 2019

Я ставлю это как ответ, потому что поля комментариев слишком малы, чтобы содержать это объяснение.

Вы уверены, что хотите просто получить число, которое больше, чем B1?В этом случае вы просто берете Nx = roundup(B1/Ax), где x - любое число от 1 до 8.
Если вы заинтересованы в получении этого числа при наименьшем количестве вычислений (при минимизации Nx), вам необходимоустановите x=8 (при условии, что числа A1 - A8 упорядочены в порядке возрастания).
Однако, если вас интересует сумма, выше B1, который ближе всего к B1 (который вам кажетсяискать, основываясь на ваших ответах), тогда может быть полезна ссылка, предоставленная Cybernetic Nomad.

Другими словами: уточните свой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...