我有特定顺序的给定数量的盒子和特定顺序的重量。重量可能有不同的重量(即一个可能重 1 公斤,另一个可能重 2 公斤等)。我想以某种方式将重量放在盒子中,以便它们在重量方面尽可能均匀分布。我必须按照给出的顺序取重量,我必须按照给出的顺序填满箱子。也就是说,如果我在盒子 n+1 中放了一个重量,我就不能在 n 盒子里放一个重量,而且在我首先将重量 m 放入一个盒子之前,我不能将重量 m+1 放入一个盒子中。
我需要找到一种算法来解决任意数量的盒子和任意一组权重的这个问题。
使用 xUnit 在 C# 中进行一些测试(分发是应该解决问题的方法):
[Fact]
public void ReturnsCorrectNumberOfBoxes()
{
int[] populatedColumns = Distribute(new int[0], 4);
Assert.Equal<int>(4, populatedColumns.Length);
}
[Fact]
public void Test1()
{
int[] weights = new int[] { 1, 1, 1, 1 };
int[] boxes = Distribute(weights, 4);
Assert.Equal<int>(weights[0], boxes[0]);
Assert.Equal<int>(weights[1], boxes[1]);
Assert.Equal<int>(weights[2], boxes[2]);
Assert.Equal<int>(weights[3], boxes[3]);
}
[Fact]
public void Test2()
{
int[] weights = new int[] { 1, 1, 17, 1, 1 };
int[] boxes = Distribute(weights, 4);
Assert.Equal<int>(2, boxes[0]);
Assert.Equal<int>(17, boxes[1]);
Assert.Equal<int>(1, boxes[2]);
Assert.Equal<int>(1, boxes[3]);
}
[Fact]
public void Test3()
{
int[] weights = new int[] { 5, 4, 6, 1, 5 };
int[] boxes = Distribute(weights, 4);
Assert.Equal<int>(5, boxes[0]);
Assert.Equal<int>(4, boxes[1]);
Assert.Equal<int>(6, boxes[2]);
Assert.Equal<int>(6, boxes[3]);
}
任何帮助是极大的赞赏!