Portál AbcLinuxu, 11. května 2025 10:30
Zadání: V internetovém obchode je možno zakoupit zboží v různých baleních za různou cenu. např. bal1 (1ks, 20kč/ks) bal2 (5ks, 18kč/ks) bal3 (10ks, 19kč/ks) bal4 (50ks, 17kč/ks)
Zákazník požaduje např 78ks zboží a program by měl optimální počty balení vložit do košíku, aby to pro zázaníka bylo cenově nejvýhodnější.
Takže v tomto případě 1*bal4, 5*bal2, 3*bal1.
Napadá vás jiné řešení než zkoušet všechny možné kombinace a poté vyhodnotit která je nejvýhodnější.
Díky.Řešení dotazu:
78 / 50 = 1 (28)/ 5 = 5 (3) / 10 = 0 (3) / 1 = 3 (0)
bal1 (1ks, 100kč/ks) bal2 (7ks, 10kč/ks) bal3 (20ks 9kč/ks) a zákazník požaduje 21ks
dle tohoto by vyšlo 1*bal3 + 1*bal1 výsledná cena 280kč
správně by mělo být 3*bal2 výsledná cena 210kč
K
je požadovaný počet kusů. Na vstupu jsou dvojice (počet kusů v balení, cena balení).
Inicializace: Udělám pole arr
indexované čísly 1..K
, kde i
-tý prvek pole
je roven nejnižší ceně za balení s i
kusy, pokud takové balení neexistuje, je tam nekonečno.
n
-tý krok algoritmu: Prvky 1..n-1
se už nezmění a obsahují optimální cenu za dané počty kusů. Nyní spočítáme optimální cenu za n
kusů. M
je minimum hodnot arr[i] + arr[n-i]
přes všechna i=1..n-1
. Nejnižší cena za n
kusů je arr[n] <- min(M, arr[n])
.
přes všechna i=1..n-1
stačí přes všechna i=1..(n-1 div 2)
jestli se nepletu
class Variation { var $pieces_arr=array(); var $prices_arr=array(); var $sum_count=0; var $sum_price=0; function Variation() { } function setPieces($type, $count, $price){ $this->pieces_arr[$type] = $count; $this->prices_arr[$type] = $count*$price; $this->sum_count = array_sum($this->pieces_arr); $this->sum_price = array_sum($this->prices_arr); } } class VariationSolver { var $itemsArr = array(); var $reqCount = 0; var $BestVar; function VariationSolver() { $this->BestVar = null; } function setRequestedCount($count){ $this->reqCount = $count; } function addVariationItem($type, $piece, $price){ $this->itemsArr[] = array($type, $piece, $price); } function compute($level, $VarObj){ $max_level = sizeof($this->itemsArr)-1; $increment = $this->itemsArr[$level][1]; for ($i = 0; $i==0 || ($i <= $this->reqCount && ($VarObj->sum_count+$increment)<=$this->reqCount) ; $i=$i+$increment) { $VarObj->setPieces($this->itemsArr[$level][0], $i, $this->itemsArr[$level][2]); if ($max_level>$level){ $this->compute($level+1, $VarObj); } else { if ($VarObj->sum_count==$this->reqCount){ if ($this->BestVar == null || $VarObj->sum_price < $this->BestVar->sum_price){ $this->BestVar = $VarObj; } } } } } function getBestVar(){ //slow $this->BestVar = null; if (sizeof($this->itemsArr)>0){ $this->compute(0, new Variation()); } return $this->BestVar; } } //==== Vypocet ==== $VS = new VariationSolver(); $VS->setRequestedCount(100); $VS->addVariationItem("N",1,100); // typ baleni, pocet kusu v baleni, cena za kus $VS->addVariationItem("B",2,95); // typ baleni, pocet kusu v baleni, cena za kus $VS->addVariationItem("A1",5,90); // typ baleni, pocet kusu v baleni, cena za kus $VS->addVariationItem("D",10,98); // typ baleni, pocet kusu v baleni, cena za kus $VS->addVariationItem("IC1",20,81); // typ baleni, pocet kusu v baleni, cena za kus $VS->addVariationItem("IC2",50,80); // typ baleni, pocet kusu v baleni, cena za kus print_r( $VS->getBestVar() );
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.