У меня есть заданное количество коробок в определенном порядке и количество весов в определенном порядке. Гири могут иметь разный вес (т.е. один может весить 1 кг, другой 2 кг и т.д.). Я хочу положить гири в коробки таким образом, чтобы они были как можно более равномерно распределены по весу. Я должен взять гири в том порядке, в котором они даны, и я должен заполнить ящики в том порядке, в котором они даны. То есть, если я положу гирю в коробку n+1, я не смогу положить гирю в коробку n, а я не смогу положить в коробку гирю m+1, пока я сначала не положу в коробку гирю m.
Мне нужно найти алгоритм, решающий эту задачу для любого количества ящиков и любого набора весов.
Несколько тестов на C# с помощью xUnit (Distribute — метод, который должен решить проблему):
[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]);
}
Любая помощь приветствуется!