我必须分发我。没有。将物品分成n号。每个盒子具有不同容量等级c1,c2 ... cn的盒子。我想按照容量的比例分配物品。所以容量最大的盒子将包含最高的no。项目,反之亦然。容量可能不是按升序排列的。容量也可以是0.另外,如果没有。物品超过总容量,然后将所有箱子填满最大容量。
这个问题已经解决了吗?
因为我写了以下算法。但它效率不高。它的循环无限地跟随输入。由于-2差异永远不会解决。因此,还必须有其他用例,它会中断。
SampleUserControl
答案 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)
想到两种方法
最佳舍入
将问题视为最佳舍入问题。由于您希望按照容量和#34;的比例在框中分配项目,然后为每个框计算它们的份额,即&#34; capacity / sum of all capacities
&#34;。然后将该份额乘以项目数。这通常会为每个盒子提供一小部分物品。我认为你的物品是不可分割的。现在你只需要确定如何最佳地围绕&#34;这些价值观。 Here是一个讨论如何做到这一点的问题。您还可以在整数约束下搜索&#34;最佳舍入&#34;找到几篇关于这个主题的论文。
公平分部
使用fair division处理问题。该链接涵盖了许多方法(大多数是近似值)。但是,关键部分将是每个盒子如何为每个项目赋值,以便算法知道如何包裹项目。您可以使用与其容量成比例的指标。