2011-12-15 50 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)