找到可能的组合数量

时间:2014-08-15 15:57:53

标签: algorithm theory

我有一个困扰我的问题。我认为这是一个优雅的解决方案,但我还没有找到它。问题是这样的:

我有一套独特的物品。我被允许从该集合中选择最多 n 项目,以形成子集。那么问题是,有多少独特的子集可能

说我有这套 3 项:

A B C

我可以从套装中挑选最多 2 项目。答案是:

(none)
A
B
C
AB
AC
BC

也就是说,答案是 7 。有7个独特的子集可能。

如何以编程方式获得该解决方案?

如果重要的话,我的套装最多有8个项目,我的答案中的最大项目数量最多为3个。但是,它们有所不同,因此我想看看是否更容易,更多优雅的方式来达到这个目的,而不是蛮力计数。

1 个答案:

答案 0 :(得分:3)

如果你想要从n中选择最多k项的方法数,那么你可以求和二项式系数n选择i为i从0到k,例如,

static int ways(int n, int k) {
  int sum = 0, nci = 1, i;
  for (i = 0; i <= k; i++) {
    sum += nci;
    nci *= n - i;
    nci /= i + 1;
  }
  return sum;
}