【问题标题】:PHP find cheapest permutationPHP找到最便宜的排列
【发布时间】:2019-07-28 19:06:31
【问题描述】:

我有多种产品都有尺寸,我需要找到满足最小尺寸要求的最便宜的配置。

例如,约翰需要至少 10 升的存储空间 - 可以更多,但不能更少。

有 2L、3L、5L、8L 和 10L 选项(但这可以改变)。

例如,购买可能更便宜:

  • 1x10L 容器或
  • 2x5L 容器或
  • 1x2L、1x3L 和 1x5L 或
  • 4x3L(这个超过10L,不过还是有可能便宜点)

到目前为止,我已尝试循环最多 4 次(因为通常最大要求为 40 L),但在某些情况下我的内存不足,而且它似乎不是最有效的这样做的方法。


// Size is in mL

$available_containers = [
[
  'id' => 22700,
  'price' => 1190,
  'size' => 2000,
],
[
  'id' => 22701,
  'price' => 1245,
  'size' => 3000,
],
[
  'id' => 22702,
  'price' => 1415,
  'size' => 4000,
],
[
  'id' => 22715,
  'price' => 12300,
  'size' => 5000,
],
[
  'id' => 22706,
  'price' => 1740,
  'size' => 5000,
],
[
  'id' => 22703,
  'price' => 1510,
  'size' => 5000,
],
[
  'id' => 22707,
  'price' => 1790,
  'size' => 6000,
],
[
  'id' => 22704,
  'price' => 1770,
  'size' => 6000,
],
[
  'id' => 22708,
  'price' => 2215,
  'size' => 7000,
],
[
  'id' => 22705,
  'price' => 2195,
  'size' => 8200,
],
[
  'id' => 22709,
  'price' => 2660,
  'size' => 8200,
],
[
  'id' => 22710,
  'price' => 2799,
  'size' => 10000,
],
[
  'id' => 22711,
  'price' => 2910,
  'size' => 12500,
],
[
  'id' => 22712,
  'price' => 3260,
  'size' => 15000,
],
[
  'id' => 22713,
  'price' => 4130,
  'size' => 20000,
],
[
  'id' => 22714,
  'price' => 3770,
  'size' => 27000,
]
];

$required_size = 8; // Can change.
$container_install = 5;

foreach ( $available_containers as $v ){
  foreach ( $available_containers as $v2 ){
    foreach ($available_containers as $v3 ) {
      foreach ( $available_containers as $v4 ){

        $all_configs = [
          [
            'size' => $v['size'],
            'configuration' => [ $v['size'] ],
            'price' => $v['price'],
          ],
          [
            'size' => $v['size'] + $v2['size'],
            'configuration' => [ $v['size'], $v2['size'] ],
            'price' => $v['price'] + $v2['price'] + $container_install,
          ],
          [
            'size' => $v['size'] + $v2['size'] + $v3['size'],
            'configuration' => [ $v['size'], $v2['size'], $v3['size'] ],
            'price' => $v['price'] + $v2['price'] + $v3['price'] + $container_install + $container_install,
          ],
          [
            'size' => $v['size'] + $v2['size'] + $v3['size'] + $v4['size'],
            'configuration' => [ $v['size'], $v2['size'], $v3['size'], $v4['size'] ],
            'price' => $v['price'] + $v2['price'] + $v3['price'] + $v4['price'] + $container_install + $container_install + $container_install,
          ],
        ];


        foreach ( $all_configs as $c ){
          if ( $c['size'] >= $required_size ){
            $configuration[] = array(
              'configuration' => $c['configuration'],
              'size' => $c['size'],
              'price' => $c['price'],
            );
          }
        }
      }
    }
  }
}


// Sort by price.
$sorted_configs = array_sort($configuration, 'price', SORT_ASC); // This function simply sorts all permutations by price

【问题讨论】:

  • n x n x n x n 不是一个好的复杂度。你可以试试这个递归函数docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm
  • 你应该做的是循环一次,可能是一个while循环,然后使用除法得到它进入每个循环的次数(按从大到小的顺序)减去那个值,然后再来一遍。每次减少原始值。
  • 这似乎更像是codereview.stackexchange.com的问题
  • 谢谢@JosuaMarcelChrisano - 我去看看。
  • @ArtisticPhoenix - 我不是数学天才 - 只是一个程序员哈哈。你能举例说明一下吗?

标签: php algorithm math search


【解决方案1】:

嗯,有一些要点可以使这些循环变得轻量级。这个问题必须用分而治之的方法来解决。

  1. 创建一个子数组,因为您不需要整个数组,只需要一个从 1L 到 10L 的新子数组。
  2. 子数组应按价格从低到高排序。
  3. 当且仅当代表第一个指数的最低价格只能买一次,break 循环。
  4. 否则,您应该有一个列表,当您已经循环时,该列表将输出。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2017-05-27
    • 2021-02-25
    相关资源
    最近更新 更多