php 基于 shell 尺寸的最低成本

q3aa0525  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(84)

我正在开发一个葡萄酒运输模块,不知道是否有人能给予我一把, -基本上就是:
葡萄酒可以装在8瓶、12瓶或15瓶的箱子里运输,每种都有自己的价格。模块需要取订单中的总瓶数,并计算出哪种箱子组合给出最低价格。例如,在31瓶的订单中,最低价格计算出1箱15瓶和2箱8瓶。(而不是15的2种情况和8的1种情况,或者12的2种情况和8的1种情况)。目前,我有以下几种,几乎可以工作,但错过了几种可能的组合

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);
fhity93d

fhity93d1#

从你的帖子中,你说最具性价比的系统不仅仅是使用最低成本的每瓶容器,而且还需要最有效地填充容器。然而,你的算法只考虑使用最少的大盒子。你需要一个算法,将完全填充每一个可能的情况。
我会这样做:使用递归程序找到最能完全填充每个用例的组合。

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);

希望这个有用。

blpfk2vs

blpfk2vs2#

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

  • 1瓶-8
  • ...
  • 31瓶- 15-8- 8、15 -15- 8、8 - 8 -8-8,以此类推
  • 等等

使用另一个查找表了解每个国家每箱的不同费率
在您的功能中

  • 获取国家价格表行
  • 获得不同瓶数的组合
  • 对组合执行foreach循环
  • 将第一个循环的价格和组合保存到变量
  • 比较下一个循环的价格和保存的值
  • 如果低于,则保存价格和组合,否则继续
  • 循环所有组合
  • 返回最低价格/箱组合

相关问题