Максимизируя количество строк, содержащих три элемента, вы можете минимизировать общее количество строк. Таким образом, шесть элементов будут сгруппированы в две строки по 3, а не в три строки по 2:
[1][2][3]
[4][5][6]
и десять элементов будут сгруппированы в два ряда по 2 и два ряда по 3, а не в пять рядов по 2:
[ 1 ][ 2 ]
[ 3 ][ 4 ]
[5][6][7 ]
[8][9][10]
Если вы хотите сначала строки с двумя элементами, то вы продолжаете снимать два элемента, пока оставшиеся элементы не будут делиться на 3. По мере прохождения цикла вам необходимо отслеживать количество оставшихся элементов с помощью индекса или этажерка.
В вашем цикле для заполнения каждой строки вы можете проверить следующие условия:
//logic within loop iteration
if (remaining % 3 == 0) //take remaining in threes; break the loop
else if (remaining >= 4) //take two items, leaving two or more remaining
else //take remaining items, which will be two or three; break the loop
Если мы рассмотрим пример из 10 пунктов, процесс будет выглядеть следующим образом:
- 10 пунктов осталось. 10% 3! = 0. Поскольку 10> 4, возьмите два предмета.
- осталось 8 предметов. 8% 3! = 0. Поскольку 8> 4, возьмите два предмета.
- осталось 6 предметов. 6% 3 = 0. Возьмите эти 6 предметов группами по три.
Чтобы перейти к вашему примеру из 7 предметов:
- осталось 7 предметов. 7% 3! = 0. Так как 7> 4, возьмите два предмета.
- Осталось 5 предметов. 5% 3! = 0. Поскольку 5> 4, возьмите два предмета.
- осталось 3 предмета. 3% 3 = 0. Возьмите эти 3 предмета как группу.
А вот результат для 4 предметов:
- осталось 4 предмета. 4% 3! = 0. Поскольку осталось = 4, возьмите два предмета.
- осталось 2 предмета. 2% 3! = 0. 2 <4. Перейдите в другое состояние, возьмите оставшиеся предметы. </li>
Я думаю, это сработает. По крайней мере, в 12:30 утра кажется, что это должно сработать.