Выберите допустимую комбинацию взрослых и детей для номера

Моя проблема в том,

Например,

Количество взрослых = 4

Количество детей = 3

Есть две комнаты.

В каждом номере есть минимальное количество взрослых и максимальное количество взрослых, а также минимальное количество детей и максимальное количество детей. Мне нужно забронировать две комнаты с действительной комбинацией взрослых и детей в каждой комнате, может быть несколько допустимых комбинаций, но как только я получу действительную комбинацию, все будет готово.

Например,

room1 минимальное количество взрослых = 2 и максимальное количество взрослых = 3

room1 минимум детей = 1 и максимум детей = 1

room2 минимум взрослых = 1 и максимум взрослых = 1

room2 минимум детей = 1 и максимум детей = 2

Я разделил количество взрослых на следующие группы Набор 1: [4, 0][0, 4][1, 3][3, 1][2, 2]

Я разделил количество детей на следующие группы Набор 2: [3, 0][0, 3][1, 2][2, 1]

Пример допустимой комбинации: 3 взрослых и 1 ребенок в номере 1 и 1 взрослый и 2 ребенка в номере 2.

Мне нужно реализовать это на Java. Я понятия не имею, как это решить, какую структуру данных использовать и какую технику программирования.


person Code Enthusiastic    schedule 05.09.2013    source источник
comment
Просто постарайтесь сначала удовлетворить минимальное требование, а затем заполнить остальные по максимуму для каждой комнаты.   -  person nhahtdh    schedule 05.09.2013


Ответы (2)


Сначала вы создаете класс Range, позволяющий указать минимум и максимум. Затем вы создаете класс Room с двумя диапазонами. Затем вы создаете класс RoomOccupation с двумя атрибутами: количество взрослых и количество детей. Затем вы добавляете метод в класс Room, порождающий Set, содержащий все допустимые комбинации.

Далее идет сложная часть: вы перебираете 2 набора возможных занятий в обеих комнатах, добавляете количество взрослых каждого занятия в общее количество и сопоставляете это с количеством людей, которым нужна комната. если все суммы совпадают => бинго. Сложность заключается в том, что это легко запрограммировать на 2 цикла for, поскольку у вас есть 2 комнаты. Если вы хотите, чтобы ваша программа не зависела от количества комнат, вы должны исключить этот двойной цикл for и использовать рекурсию. Вместо этого вы можете создать список>. Рекурсивный метод будет использовать индекс параметра для цикла по этому list.get(index). Если index == list.size-1 и количество итогов совпадают -> бинго, иначе вызовите метод рекурсивно с index+1 в качестве параметра.

person GerritCap    schedule 05.09.2013
comment
Не могли бы вы предоставить мне небольшой фрагмент того, что вы упомянули во второй части второго абзаца? - person Code Enthusiastic; 06.09.2013

public class Room{
public int roomNumber;
public int minAdults;
public int maxAdults;
public int minChildren;
public int maxChildren;
public int numAdultsInRoom;
public int numChildrenInRoom;

public Room(int number){
this.roomNumber = number;

switch (number){
case 1:
{
minAdults = 2;
maxAdults = 3;
minChildren = 1;
maxChildren = 1;

}//case1
break;

case 2:
{
minAdults = 1;
maxAdults = 1;
minChildren = 1;
maxChildren = 2;

}//case2
break;
}//switch

numAdultsInRoom = 0;
numChildrenInRoom = 0;
}//room

}//room class

при получении нового ввода

HashMap<Integer,Room> roomsMap = new HashMap<Integer,Room>();

roomsMap.put(1,new Room(1));
roomsMap.put(2,new Room(2));

вход в комнату

if room is 1, and person is child
   if (maxchildren in room> children in room){
childrenInRoom++;
}

и так далее

при редактировании: Room r = roomMap.get(roomNumber); изменить r, вернуть r

person Lena Bru    schedule 05.09.2013
comment
Автор вопроса, кажется, учится. Я считаю, что для них было бы лучше, если бы вы объяснили, как работает решение, а не предоставили им готовое решение. - person Philipp; 05.09.2013