algorithm - 产品可能的房间组合

标签 algorithm

我有一个产品有多种可用和可定制的房间。例如:

  • 1人间
  • 可容纳 2 人的客房,配备一张特大号床
  • 2 人间,配备两张分开的床
  • 3人间

当客户订购产品(旅行)时,他会为我们提供一些参与者(例如:2 名成人和 2 名 child ......)

我必须让客户能够选择各种房间的组合。对于我们的例子,我们应该有:

  • 1人4间
  • 1人1间和3人1间
  • 1 间 2 人房,带特大号床 + 1 间 2 人房,带独立床
  • 2 间可容纳 2 人的特大号床
  • 2 间 2 人间,带分开的床

此时,我不知道该怎么办!

最佳答案

这是 subset sum 的变体问题(具有 2 个维度,成人和 child ),其中您的总和是人数和 child 的数量,元素是房间。

看来,你的问题相当小(你不会有数百种房型,只有几种,而且每个旅行者为少数人预订房间),所以显示所有可能性的蛮力是一个解决问题的可能性。

想法是以递归方式生成所有此类房间,并在向客户展示可能性之前 - 检查它是否满足要求。
递归算法将首先“猜测”您是否要使用当前房间类型,并且对于这两个选项 - 递归以解决较小的问题。

类 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);
}

关于algorithm - 产品可能的房间组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200608/

相关文章:

java - 为什么在这个问题中 4-pass 解决方案的性能比 1-pass 解决方案更快?

algorithm - 不使用系统时钟管理任务

python - 如何用一种算法让白名单功能更加有效?

algorithm - 理解单词对齐

c++ - 像钻石一样的信号量

algorithm - 什么是订单统计和最小的?

mysql - 高效遍历关系数据库中以表形式存储的图

算法分析 - 在 O(1) 中使用冲突列表进行哈希搜索

python - 如何检查有序的非连续子序列是否在数组中? Python

php - 找到特定数字的质因数