2015-08-14 6 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). Расскажите, что вы пробовали и почему это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ. Также см. [Ask] – 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-жесткий, однако существуют простые эвристики, которые ведут себя (возможно) лучше, чем тот, который вы предлагаете. Например, первый алгоритм уменьшения сглаживания, который будет состоять из сортировки элементов от самого большого до самого маленького и вставки их в первый ящик, в котором они подходят (создание нового бункера, если ни один из существующих не имеет достаточной оставшейся емкости)

Смежные вопросы