2

我正在研究葡萄酒的运输模块,想知道是否有人可以帮我一把——基本上:

葡萄酒可以一箱 8、12 或 15 瓶装运,每箱都有自己的价格。该模块需要获取订单中的瓶子总数,并计算出哪种组合的价格最低。例如,在 31 瓶的订单中,最低价格为 1 箱 15 瓶和 2 箱 8 瓶(而不是 2 箱 15 瓶和 1 瓶 8 瓶,或 2 箱 12 瓶和 8 瓶之一)。目前,我有以下,几乎可以工作,但错过了一些可能的组合

    foreach ($rates as $case_size => $case_price) 
    {
      $price = floor($total_bottles / $case_size) * $case_price;
      $rem = $total_bottles % $case_size;
      if($rem > 12)
      {
       //needs to use another case of 15 
       $price = $price + $rates[15];
      }
      elseif($rem > 8)
      {
        //needs an extra case of 12
        $price = $price + $rates[12];
      }
      elseif($rem > 0)
      {
        //needs an extra case of 8
        $price = $price + $rates[8];
      }
      $quotes[] = $price;
    }

    return min($quotes);
4

2 回答 2

0

从您的帖子中,您说最具成本效益的系统不仅是每瓶容器使用最低成本的系统,而且还需要在填充容器时最有效。但是,您的算法只考虑使用尽可能少的大盒子。您需要一种能够完全满足每种情况的算法。

我会做这样的事情:使用递归程序来找到最能完全满足每种情况的组合。

function fit_case($number, $case_size) {
     $rem = $number % $case_size;
     $next_size=magic_voodo0();
     if($rem==0) {        //if perfectly fills it you're done
           return ($number/$case_size)*$rates[$case_size];
     } else if(($rem % $next_size)/$next_size>.5) {               
     //if over 50% fills the next case add the next smaller case
           return floor($number/$case_size)*$rates[$case_size]+fit_case($rem, $next_size);
      } else {        //otherwise back off 1 of the biggest cases, and fill the rest
         return (floor($number/$case_size)-1)*$rates[$case_size]+fit_case($rem, $next_size);

希望这可以帮助。

于 2013-05-11T17:12:39.123 回答
0

不同的做法。使用查找表,其中包含特定数量瓶子的所有框组合。

  • 1 瓶 - 8
  • ...
  • 31瓶 - 15-8-8,15-15-8,8-8-8-8等
  • 等等

对每个国家/地区的每箱不同费率使用另一个查找表

在你的功能

  • 获取国家/地区价格的表格行
  • 得到瓶子数量的不同组合
  • 对组合进行 foreach 循环
  • 将第一个循环的价格和组合保存到变量中
  • 将下一个循环的价格与保存的值进行比较
  • 如果它更低,保存价格和组合/如果不是,继续
  • 遍历所有组合
  • 返回最低价格/盒子组合
于 2013-05-11T17:30:35.210 回答