Implementacje przedziałów cenowych (ala widełki)

0

Mam oto taki wydający sie banalny problem, ale jakoś cholera nie moge sobie z tym poradzić - żeby był optymalny. Amnezja. A więc do rzeczy. Chodzi o przeliczanie cen według widełek. I tak widełki wyglądają tak, że np. dla 4 jest to cena 25zł a np. dla 2 - 20zł. Oznacza to, że ilość z przedziału 3-4 mieści się w widełkach 4, natomiast 1-2 w 2. I teraz jak masz np. 27 to idziesz od góry i liczysz wielokrotność największej i odejmujesz ilość. W tym przypadku wyjdzie 6, czyli 6 * 25zł. Pozostaje 3. I teraz jest tak, że jak jest 3 to nadal zawierać ma się w 4 - nie może wpaść do 2. Może bardziej obrazowo:

4 => 25
2 => 20
price = 0;
count = 27

Przy pierwszym obiegu z 27 zostaje 3 (cost += 25 * 6;)
Przy kolejnym jest 2 a więc gdy jest 3 powinien wybrać kwotę z 4, czyli: cost += 25;

Ma ktoś pomysł na to albo rozwiązanie?

0

Nie rozumiem pytania. Przecież właśnie opisałeś dokładnie algorytm wyliczania kosztu. Gdzie jest problem? Przecież to jest zwykła zabawa z wykorzystaniem dzielenia i reszty z dzielenia i mapy int->int

0

Napisałem coś takiego w phpie:

$count = 7;

$cost = array(
    4 => 25,
    2 => 20
);

$price = 0;

foreach($cost as $qty => $p){
    if($count >= $qty){
        $FL_ = floor($count / $qty);
        $price += $FL_ * $p;
        $count -= $FL_ * $qty;
        
        continue;
    } 
    elseif($count > 0 && $count < $qty){
        $price += $p;
        $count = 0;
        break;
    }

}

echo $price;

Prawie fajnie. Z pierwszego 7 dzieli i odejmuje, że by było reszta 3. Kolejna iteracja to już 2. I wtedy też pasuje dla 3 pierwszy if. Ale dla 3 powinien wziąć też z 4. Jak to właśnie zgrabnie przeliczyć na szybko?

edit:
A co gdy zaczniesz od 3 i pominie pierwszą iteracje? Może powinien zapamiętywać sobie na stosie ostatnią iteracje?

1

Źle to nawet na kartce sobie policzyłeś :P Bo dla 7 powinieneś mieć 25+25 (bo w przedziale 3-4 masz zarówno 3 jak i 4). Musisz sobie transponować tą mapę tak żeby dzielić przez dolną granicę przedziału a nie górną. Tzn zamiast
4->25
2->20
masz mieć
3->25
1->20

0

Dzięki. Wiesz jak to jest. Prywatnie coś komuś robisz po ośmiu godzinach w normalnej robocie i ciężko tak sobie czasami to wymyślić :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1