1

我将首先描述我的 excel 文件的外观以及我想要做什么。首先想象一些组合,让我们从一个例子开始,这是我的A栏:

A
B
C
D
AB
AC
AD
BC
BD
CD
ABC
..

..
..
ABCD

我希望每个人都明白这一点。我想做的是在 VBA 中编写一个代码来执行以下操作。例如,如果我要选择 A,那么我的选项将是:B、C、D 或 BC、D 或 BD、C 或 CD、B 或 BCD.......等等。这样我会得到很多可能性。我希望我的 VBA 将其放置在下一张表中,然后放在列中,因此它将它们彼此相邻放置,以便可见....

我想这样做的不仅仅是 A 到 D,而是整个专栏中的内容,因此请探索所有选项。我知道如果我有 A 到 D 它是 5 个变量,因此等式是 2^4 -1 个选项。但是当 4 增加到可能的 50 时,应该仍然可以放置所有选项。

有人可以帮助我使用此代码或为我指明正确的方向。

4

1 回答 1

0

我编写了一个类来处理处理二项式系数的常用函数,这是您的问题所属的问题类型。它执行以下任务:

  1. 将任何 N 选择 K 的所有 K 索引以良好的格式输出到文件。K-indexes 可以替换为更具描述性的字符串或字母。这种方法使得解决这类问题变得非常简单。

  2. 将 K 索引转换为已排序二项式系数表中条目的正确索引。这种技术比依赖迭代的旧已发布技术快得多。它通过使用帕斯卡三角形固有的数学属性来做到这一点。我的论文谈到了这一点。我相信我是第一个发现并发表这种技术的人,但我可能是错的。

  3. 将已排序二项式系数表中的索引转换为相应的 K 索引。我相信它可能比您找到的链接更快。

  4. 使用Mark Dominus方法计算二项式系数,它不太可能溢出并且适用于更大的数字。

  5. 该类是用 .NET C# 编写的,并提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用一个名为 InitTable 的 bool 值,当它为 true 时,将创建一个通用列表来保存要管理的对象。如果此值为 false,则不会创建表。无需创建表即可执行上述 4 种方法。提供了访问器方法来访问表。

  6. 有一个关联的测试类,它显示了如何使用该类及其方法。它已经用 2 个案例进行了广泛的测试,并且没有已知的错误。

要了解此类并下载代码,请参阅制表二项式系数

您可能可以从您的 vba 程序中调用我的课程,因此它可能不需要转换为 vba。另一方面,如果您确实需要隐藏它(因为它是一个泛型类并且 vba 可能无法使用 com interop 处理它),那么它不应该是非常简单的。

您的问题的解决方案涉及为每个 N 选择 K 案例生成 K 索引。因此,在上面的示例中,N(A、B、C、D)有 4 种可能性,代码(在 C# 中)看起来像这样:

int TotalColumns = 4;
int N = TotalColumns;
// Loop thru all the possible groups of combinations.
for (int K = N - 1; K < N; K++)
{
   // Create the bin coeff object required to get all
   // the combos for this N choose K combination.
   BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
   int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
   int[] KIndexes = new int[K];
   // Loop thru all the combinations for this N choose K case.
   for (int Combo = 0; Combo < NumCombos; Combo++)
   {
      // Get the k-indexes for this combination, which in this case
      // are the indexes to each column starting with zero.
      BC.GetKIndexes(Loop, KIndexes);
      // Do whatever processing that needs to be done with the indicies in KIndexes.
      ...
   }
   // Handle the final combination which in this case is ABCD since since K < N.
   ...
}
于 2012-10-19T17:17:23.363 回答