在数组C++中创建所有可能的非唯一整数组合
Create all possible combinations of non unique integers in an array C++
我有一个带预订模块的酒店管理应用程序。我希望能够为大型团体计算可能的房间组合。
我有一系列目前可用的所有房间容量。下面的阵列将描绘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!
已经是一个完全不同的故事;)。
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 如何在以 256 为基数的唯一 xLen-digit 表示中写一个整数 x?
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 从输入文件读取整数,仅存储数组C 中的唯一整数
- 在数组C++中创建所有可能的非唯一整数组合
- 如何将唯一的随机整数插入链表中
- 将整数分配给 std::vector 中排序的唯一元素
- 获取C++中的随机唯一整数
- 将 n 个整数组合成一个唯一的表示形式
- 有没有办法从下面的数据中唯一地构建一个整数
- 数组中的唯一整数
- 如何创建非常大的唯一整数数组
- 随机生成唯一整数C++
- 为什么唯一的带符号整数类型会导致clang中的溢出警告
- 是否有更好的实现来保持唯一整数对的计数
- 更快的方式,然后我填充一个唯一的整数除了两个值的向量?c++
- 如何将三个整数组合成一个唯一的标记,使标记在c++中保持整数
- c++中从字符串生成唯一无符号整数的最佳方法是什么?
- 为什么控制台在使用运算符的地址时只打印整数变量的1个唯一地址
- 如何计数unordered_set中的唯一整数