javascript - 对总分区权重有限制的分区加权元素

标签 javascript algorithm

给定大量正整数“权重”,例如[ 2145, 8371, 125, 10565, ... ],以及一个正整数“重量限制”,例如15000,我想将权重划分为一个或多个更小的数组,条件如下:

  1. 我想尽量减少分区数。
  2. 单个分区的总和不能超过重量限制。 (请注意,任何单个重量都不会超过此限制。)

我怀疑这个问题的复杂度很高。作为答案,我感兴趣的是:

  1. 最优解
  2. 不是很理想,但运行速度很快(近似)的解决方案

当前的非最优方法:(基本贪心算法;JavaScript)

function minimizePartitions(weights, weightLimit) {
  let currentPartition = [];
  let currentSum = 0;
  let partitions = [ currentPartition ];
  
  for (let weight of weights) {
    if (currentSum + weight > weightLimit) {
      currentPartition = [];
      currentSum = 0;
      partitions.push(currentPartition);
    }
    
    currentPartition.push(weight);
    currentSum += weight;
  }
  
  return partitions;
}

let weights = [3242, 987, 1222, 7299, 400, 10542, 10678, 513, 3977];
console.log(minimizePartitions(weights, 15000));

最佳答案

这是一个 bin-packing problem并且已知是 NP 难的。

为了快速近似,我建议从大到小排序,然后将每个元素放入最接近满的容器中。

关于javascript - 对总分区权重有限制的分区加权元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808877/

相关文章:

algorithm - 使用给定遍历验证二叉树

java - 如何在我的对象层次结构中找到循环?

algorithm - 如何在 LC3 中用汇编代码制作排序算法

javascript - meteor.js 错误/调试不可读

javascript - 从 Chrome 和 Firefox 浏览器获取当前位置

javascript - 根据用户输入动态构造数组 - Javascript/jQuery

javascript - 如果 AJAX 响应为 null,则 jQuery 中断

php - JQuery Post 不支持 json 数据类型

arrays - MATLAB:大于 N 的组的二进制数组计数

c++ - 模数公式