布尔组合数学 C++

Boolean combinatorics c++

本文关键字:C++ 组合 布尔      更新时间:2023-10-16

我正在尝试做一个组合数学类型的问题:查找布尔公式有多少个不同的变量设置将计算为true。我最初的想法是生成长度为 n 的每个可能的二进制数(n 是问题中的变量数)。对于函数 x1 或 x2,则 n=2,因此可能性为: 00, 01, 10, 11.我最初的想法是从 0 到 (n*n)-1,并使用 bitset 将每个数字转换为二进制。我的问题是位集的长度必须由运行时确定,所以没有 bitset(i),就像我计划做的那样,其中 n 是变量的数量,i 在每次迭代时。我也不能做动态位集,因为我的学校还没有安装提升库。所以现在我想知道我是否应该手动对每个数字进行数字翻译......或者如果有一个更好的解决方案,正如我想象的那样,我建议的这个解决方案在计算上是昂贵的,因为数字很大。有没有办法把它当作一个组合问题来处理,这样我就可以在 n^2 时间内运行并找到长度为 n 的每个可能的布尔设置,而无需将每个数字转换为二进制?

为此形成的直接公式是4n-2n
解释
对于 n 位数字,可能的组合总数为 4n。为了使XOR b为真,它们至少有一个位应该不同。
对于 a 和 b 在一个位置的位,有 4 种可能性 (00,01,11,10),在这 11,00 种情况下,两个位都相同。现在我们找到组合的数量,使得一个位置上的所有机器人在两个数字中都相同(即,XOR b 为假)。这等于 2 n 因此,所需的组合为4 n-2n