我有一个带有预订模块的酒店管理应用程序。我希望能够为大型团体计算可能的房间组合。
我拥有一系列当前可用的所有客房容量。下面的阵列将描述10个免费客房:2张单人床,2张双人床等。
int currenylyAvailableRooms [10] = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
Id喜欢查询此数组,并确定是否存在可容纳x
位客人的房间组合。例如,我想知道是否有适合21位客人的组合。 (对于上面的示例,它将返回true
,例如5,5,4,4,2,1-可能有不止一种组合。
请紧记,酒店可能会非常庞大,并拥有20间单人房(20 x 阵列中的1个)和10个可容纳10人的套房(10 x 10 数组)的
currenylyAvailableRooms
数组甚至有100个元素。
我有点担心,当数组有100个元素时,这是一个相当耗时的计算,因此,我很乐意每次数组更改时都运行它,并在需要时将所有可能的组合存储在数据库中。
我的问题是:如何在数组中找到总和为指定整数的元素的可能组合,或者如何计算所有可能的组合
答案 0 :(得分:0)
请考虑对于N个可用房间,给定房间是选择的一部分或不是选择的一部分,因此总共有2 ^ N个不同的选择。它们可以用树形图表示
x
/ \
/ \
x 1
/ \ / \
/ | | \
x 2 1 1+2
其中右移表示“房间正在进入”,左移表示“房间不在其中”,并且节点标记有所选房间的来宾总数。例如,当您不选择房间1而不选择房间2时,总和为0,当您选择房间1而您选择房间2时,则将房间1的容量与房间2的容量相加(标记为为1+2
)。
现在的诀窍是不要遍历所有分支直到结尾,而只能遍历
a)总和为所需的访客数=>您有解决方案。无需深入树中。
b)总和大于所需的客人人数。同样,我们无需再深入研究,因为我们仅增加了更多空间。
c)您到达了分支的末端,但仍然没有足够的空间。
在所有这三种情况下,您都可以在树中向上返回,直到到达一个尚未具有向下路径的节点。沿着这条路径继续,并重复进行,直到找到一个(或所有您愿意的话)解决方案。
这只是基本想法。穿过树的方式可能有很多变化,对输入数组进行排序并利用几个房间可以容纳相同数量的客人这一事实,您可以节省很多钱。
另一方面,具有10个元素的数组相对较小。即使考虑通常是阶乘为杀手的组合函数,10! = 3628800
仍在合理范围内,也许简单的蛮力算法就足够了。但是,100!
已经是一个完全不同的故事了;)。