分发我没有。 n没有的项目盒子,每个盒子有不同的容量等级c1,c2

时间:2015-08-14 16:04:21

标签: java algorithm

我必须分发我。没有。将物品分成n号。每个盒子具有不同容量等级c1,c2 ... cn的盒子。我想按照容量的比例分配物品。所以容量最大的盒子将包含最高的no。项目,反之亦然。容量可能不是按升序排列的。容量也可以是0.另外,如果没有。物品超过总容量,然后将所有箱子填满最大容量。

这个问题已经解决了吗?

因为我写了以下算法。但它效率不高。它的循环无限地跟随输入。由于-2差异永远不会解决。因此,还必须有其他用例,它会中断。

SampleUserControl

2 个答案:

答案 0 :(得分:2)

我想知道你是否做了简单的数学运算来找出比率可以轻松解决问题。 因此Ni是您必须分发的项目数,B所有框容量的总和(即c1+c2+...+cn

所以R = Ni/B将是你的口粮。 R*cn将是您希望放入框n

的项目数

实施例: 你有8个项目。和2盒容量4,12(N1 = 16)。 R = 8/(4+12) = 1/2 对于框,将R*4 = 2 第二个框会有R*12 = 6

当然你必须处理舍入问题,方框中会有+/- 1项。

PS 要解决舍入问题,您将执行以下操作。 你创建一个变量sumSoFar = 0 //initial value

box1包含R*c1 然后你添加sumSoFar+=Math.round(R*c1)

box2包含Math.round(R*c2) 然后你添加sumSoFar+=Math.round(R*c2)

为您放置的最后一个框N1-sumSoFar所以您分发所有值。

这是代码:

static int[] distribute(int[] boxes, int items) {
    int[] result = new int[boxes.length];
    int sumSoFar = 0;
    int totalCapacity = 0;
    for (int box : boxes) {
        totalCapacity += box;
    }
    float R = (float) items / totalCapacity;

    for (int i = 0; i < boxes.length - 1; i++) {
        int box = boxes[i];
        result[i] = Math.round(R * box);
        sumSoFar += result[i];
    }
    result[boxes.length - 1] = items - sumSoFar;
    return result;
}

通话:

System.out.println(Arrays.toString(distribute(new int[]{1, 2}, 10)));
System.out.println(Arrays.toString(distribute(new int[]{4, 12}, 8)));

结果:

[3, 7]
[2, 6]

答案 1 :(得分:1)

想到两种方法

  1. 最佳舍入

    将问题视为最佳舍入问题。由于您希望按照容量和#34;的比例在框中分配项目,然后为每个框计算它们的份额,即&#34; capacity / sum of all capacities&#34;。然后将该份额乘以项目数。这通常会为每个盒子提供一小部分物品。我认为你的物品是不可分割的。现在你只需要确定如何最佳地围绕&#34;这些价值观。 Here是一个讨论如何做到这一点的问题。您还可以在整数约束下搜索&#34;最佳舍入&#34;找到几篇关于这个主题的论文。

  2. 公平分部

    使用fair division处理问题。该链接涵盖了许多方法(大多数是近似值)。但是,关键部分将是每个盒子如何为每个项目赋值,以便算法知道如何包裹项目。您可以使用与其容量成比例的指标。