Еще один -
# ^-?0*(?:20(?:[0-4][0-9]|5[0-5])|[0-9]{1,3})$
^
-?
0*
(?:
20
(?:
[0-4] [0-9]
|
5 [0-5]
)
|
[0-9]{1,3}
)
$
бу, то, что ты хочешь, очень возможно. Это будет довольно сложным делом, особенно если у вас 5 разных размеров упаковки. Я бы предложил использовать рекурсию.
создайте метод, который находит наименьшее количество самых больших пакетов, в которые может поместиться ваш заказ. допустим, он помещается в 4 больших ящика. затем возьмите каждую большую коробку и попытайтесь упаковать ее в меньшие коробки. трассы будут выглядеть примерно так, где прямоугольник 5 - самый большой прямоугольник, а прямоугольник 1 - самый маленький прямоугольник.
box5 - box5 - box5- box5
box5 - box5 - box5- box4
box5 - box5 - box5- box3
box5 - box5 - box5- box2
box5 - box5 - box5- box1
, что пробег будет вписываться в 3 больших ящика и 1 маленький ящик.
Код для поиска самого большого ящика, вероятно, будет подобным циклу while
int boxCount = getInitBoxCount(products);
public int getInitBoxCount(ArrayList<BoxItems> items)
{
if(productsFit(products,sizeLarge) == null)
{
ArrayList<BoxItems> temp1 = new ArrayList<BoxItems>();
ArrayList<BoxItems> temp2 = new ArrayList<BoxItems>();
for(int x = 0; x < items.length ; x++)
{
if(x > items.length/2)
{
temp1.add(items.get(x))
}
else
{
temp2.add(items.get(x))
}
}
return getInitBoxCount(temp1) + getInitBoxCount(temp2);
}
return 1;
}
. Это будет постоянно разбивать ваш список BoxItems пополам, пока он не уместится в число ящиков
[119 ] так что теперь мы определили порядок доставки, который будет работать, но, возможно, у него будет много дополнительного места.
Следующие 2 шага состоят в создании рекурсивного способа обрезки размера блока, такого как
// 5 is the largest
public int getSmallestBox(int boxsize,ArrayList<BoxItems> items)
{
if(productsFit(boxsize -1)!= null)
{
return getSmallestBox(boxsize -1, items)
}
else
return boxsize;
}
, и который получит наименьшую коробку, в которую мы можем поместить элементы. Последнее, что вам нужно проверить, это комбинирование ящиков. Вы можете обнаружить, что у вас есть 4 маленьких коробки, и вы можете объединить их в 2 средних коробки. после того, как вы сможете комбинировать и сокращать поля, вы сможете отслеживать результаты после каждого запуска. Таким образом, общий поток программы будет выглядеть примерно так в грубом псевдокоде.
Container[getInitBoxCount()] shipments //create an array of containers with the size of the inital box count
for(Container c : shipments)
{
c = new LargeContainer();
}
Container[] check; //create new objects into the check array. dont set one array = to anoter
do
{
check = shipments //create new objects into the check array. dont set one array = to anoter
for(Container c: shipments)
getSmallestBox(5, c);
combineBoxes(shipments);
}
while(check == shipments)
Посмотрите, может ли репринг Spring быть полезным. Чтобы в методе было повторение и другая логика, когда вы сомневаетесь, вы не получите свой первый список и т. Д.