2015-08-14 14 views
1

我有這個組的產品:如何將這些產品拆分成包?

Product  Quantity Weight Per Unit 
pro#1   7    5kg 
pro#2   5    5kg 

我希望這些產品分割成包,但包的最大重量是22千克。

我們假設我在數組中有該表,我想要一個算法來解決這個問題。

這是我到目前爲止所嘗試的。

$products = array(
    array('weight'=> 5, 'quantity' => 7), 
    array('weight'=> 5, 'quantity' => 5), 
); 
$max_weight = 22; 
$packs = array(); 
$packs_count = 1; 
foreach ($products as $product){ 
    while ($product['quantity'] != 0) { 
     $pack[$packs_count]['weight'] = $pack[$packs_count]['weight'] +$product['weight']; 
     if($pack[$packs_count]['weight'] >$max_weight){ 
      $pack[$packs_count]['weight'] = $pack[$packs_count]['weight'] - $product['weight']; 
      $packs_count++; 
     } 
     $product['quantity']--; 
} 
} 

該代碼未能獲得最後一個包的權利。

+0

[分享你的研究可以幫助每個人](http://meta.programmers.stackexchange.com/questions/6559/why-is-research-important)。告訴我們你試過了什麼,以及它爲什麼不符合你的需求。這表明你已經花時間去嘗試幫助你自己了,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案。另見[問] – gnat

+0

@gnat我更新了這個問題。謝謝。 –

+0

你爲什麼不在堆棧溢出問? http://meta.stackexchange.com/a/129632/165773 – gnat

回答

1

我解決了在PHP中使用此代碼的問題,任何額外的想法都會很棒。不管怎麼說,還是要謝謝你。

$products = array(
    array('weight'=> 4, 'quantity' => 5), 
    array('weight'=> 8, 'quantity' => 3), 
); 
$max_weight = 22; 
$packs = array(); 
$packs_count = 1; 

foreach ($products as $product){ 
    while ($product['quantity'] != 0) { 
     $pack[$packs_count]['weight'] = $pack[$packs_count]['weight'] +$product['weight']; 
     if($pack[$packs_count]['weight'] > $max_weight){ 
      $pack[$packs_count]['weight'] = $pack[$packs_count]['weight'] - $product['weight']; 
      $packs_count++; 
      $pack[$packs_count]['weight'] = $product['weight']; 

     } 
     $product['quantity']--; 
    } 
} 

print_r($pack); 
0

你試圖達到的目標對我來說還不完全清楚。我將假設您試圖最小化算法創建的包的總數。如果確實如此,您要解決的問題是Bin Packing Problem。這個算法是NP難的,但是有一些簡單的啓發式行爲(可能)比你提出的啓發式行爲更好。例如,第一個擬合遞減算法將包括將項目從最大到最小排序,並將它們插入到它們所適合的第一個倉中(如果現有倉庫中沒有足夠的剩餘容量,則創建一個新倉)