我有一种产品,有多种房间可供选择和定制。例如:
当客户订购一种产品(旅行)时,他会给我们一些参与者(例如:两个成年人和两个孩子.)
我必须让客户有能力选择各种房间的组合。以我们的例子来说,我们应该有:
在这个时候,我不知道该怎么办!
发布于 2015-07-03 07:20:43
这是子集和问题的一个变体(二维,成人和儿童),其中你的总和是人和孩子的数量,元素是房间。
尽管如此,你的问题似乎很小(你不会有几百个房间类型,只有几个房间,每个旅行者都会为很少的人预订房间),所以一个展示所有可能性的蛮力是解决问题的一种可能性。
这样做的想法是以递归的方式生成所有这样的房间,在向客户展示一种可能性之前,检查它是否满足需求。
递归算法将首先“猜测”如果您想使用当前的房间类型,并对两个选项-递归一个较小的问题。
类似Java的伪代码:
private boolean matches(List<Room> rooms, int adults, int children) {
//check if the current list of rooms satisfies the demands
}
private int numPersons(List<Room> rooms) {
int res = 0;
for (Room r : rooms) {
res += r.adults;
res += r.children;
}
return res;
}
//wrapper function
public void generateAllPossibilities(List<Room> roomTypes, int adults, int children) {
generateAllPossibilities(roomTypes, adults, children, new ArrayList<>(), 0);
}
private void generateAllPossibilities(List<Room> roomTypes, int adults, int children, List<Room> soFar, int i) {
//check stop clauses, a "good" match, or out of bound:
if (matches(soFar,adults,children)) {
showOption(soFar); //succesful stop clause
return;
}
if (i == roomTypes.size() || numPersons(rooms) > adults + children) {
return; //failing stop clause
}
//"guess" to add the current room type:
soFar.add(roomTypes.get(i));
//recurse with that guess:
generateAllPossibilities(roomTypes, adults, children, soFar, i);
//"guess" not to add the current room type
soFar.remove(soFar.size()-1));
generateAllPossibilities(roomTypes, adults, children, soFar, i+1);
}
https://stackoverflow.com/questions/31200608
复制相似问题