【发布时间】:2017-11-27 15:17:12
【问题描述】:
假设我有一个集合:{1,2,...,N},我想找到 K 个非空子集的不重复组,每个子集中具有特定数量的元素。
例如:设置:{1,2,3,4,5,6,7} 子集数量3,元素数量3,3,1。这将生成如下组:{{1,2,3},{4,5,6},{7}} or {{5,7,2},{4,3,1},{6}} 等。
在这种情况下,所有可能组的数量等于C(7,3)*C(4,3)*C(1,1)*1/(2!) = 35*4/2 = 70
如果我要生成第一个组合,然后生成第二个组合,我会得到 140 个结果,因为这种方法不会考虑阶乘。
所以我的问题是: 有没有一种简单的方法可以检查小组是否已经出现?我是否需要创建一个包含所有先前计算的组的数组,并每次检查新组是否已经生成?
【问题讨论】:
-
“我想查找非重复组” - 您的意思是要列出非重复组吗?你能举一个“重复”组的例子(你不想找到的那种)吗?
-
@גלעד ברקן 当然,对于集合 {1,2,3,4,5},子集数 3,元素数 2,2,1 的两个重复组的示例,将是: {{1,2},{3,4},{5}} 和 {{3,4},{1,2},{5}}。但我想通了!这是我的解决方案:cpp.sh/67lwt 它的作用:它列出了构成第二类 S{n,k} 的任何斯特林数的所有集合,并写出所有这些集合的数量(S{n, k})。输入由两个正整数 n 和 k 组成,其中 n>=k。源代码很糟糕,但是,嘿,我对编程很陌生,而且它可以工作,所以这足以让我开心!感谢您的关心!
标签: algorithm math combinations combinatorics