2011-12-15 36 views
1

我有一個可以在包配置的同類產品一個MySQL表:階優化PHP與MySQL

SKU PACK 
xyz  25 
abc 250 

用戶可以選擇,我想他們在25倍數希望的項目數是能夠使用可能的最大包裝填寫訂單。例如,如果用戶想要275件產品,那麼我會用abc sku中的1件和xyz sku中的1件來填充訂單。如果用戶想要225個產品,那麼我會用9個xyz來填充訂單。

我在接近問題時遇到了問題,並且正在尋找有關方法的建議。僞代碼或PHP會很棒。

回答

2

這是經典bin packing problem的變體。維基百科文章提供了所有變體的大量技術背景,但這是一個相當簡單的變體。以下可能是一種好方法:

  1. 檢索按包大小降序排列的所有可能包配置的數組。
  2. 遍歷包大小的列表。
  3. 從項目數減去當前包大小的整數倍,直到項目數小於包大小。保持包數量所需的數量。
  4. 當你到達列表的末尾時,其餘的應該會進入最小的包。
0

好吧,只需要找到最小的sku小於或等於產品,找出有多少sku適合產品,多個由sku包裝回答,然後從總和中減去。任何remander,循環。

$order = array(); 
do { 
$row = $db->query("select sku,pack from table where pack = (select max(pack) from table where pack <= $products)"); 
$order[$row[sku]] = floor($products/$row[pack]); 
$products -= $row[pack] * $order[$row[sku]] 
} while($products > 0)