在数组C++中创建所有可能的非唯一整数组合

Create all possible combinations of non unique integers in an array C++

本文关键字:唯一 整数 组合 有可能 数组 C++ 创建      更新时间:2023-10-16

我有一个带预订模块的酒店管理应用程序。我希望能够为大型团体计算可能的房间组合。

我有一系列目前可用的所有房间容量。下面的阵列将描绘10个免费房间:2张单人床、2张双人床等。

int currenylyAvailableRooms [10] = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };

我想查询这个数组,看看是否存在容纳x客人的房间组合。例如,我想知道是否有适合21位客人的组合。(对于上面的例子,它将返回true,例如5,5,4,2,1-可能有不止一个组合。

请记住,酒店可能很大,有20间单人间(20 x阵列中有1间)和可容纳10人的10间套房(阵列中有10 x 10间阵列),其中CCD_ 4阵列具有甚至100个元件。

我有点担心,当数组有100个元素时,这是一个相当耗时的计算,所以我非常乐意在每次数组更改时运行它,并在需要时将所有可能的组合存储在数据库中。

我的问题是:我如何在数组中找到元素的可能组合,这些元素的总和为指定的整数,或者我如何计算所有可能的组合

考虑到对于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!已经是一个完全不同的故事;)。