我试图找出一个方法,它会返回一个集合中所有子集组合的列表。方法调用看起来像getSubsets(7, 3)
基于下面的图像,返回的输出我需要的是以下形式和顺序:
123
124
125
126
127
134
135
136
137
145
......等等
下图显示完全计数顺序应该如何。我一直在这个上敲头一天都找不到合适的解决方案。 TIA。
答案 0 :(得分:1)
获取给定子集后的下一个子集:
如果步骤1失败,则列举了所有可能的子集。
在C:
bool next_subset(int* subset, int n, int k) {
// subset is a vector of k ints in the range [0, n)
int i, j;
for (i = k - 1, j = n - 1; subset[i] == j; --i, --j) {
if (i == 0)
return false; // No more subsets
}
for (j = subset[i] + 1; i < k ; ++i, ++j) {
subset[i] = j;
}
return true;
}
答案 1 :(得分:0)
如果事先知道m
getSubsets(n, m)
,则代码只是嵌套for循环;例如。在Mathematica:
With[{n = 7},
Table[{i, j, k},
{i, n - 2}, {j, i + 1, n - 1}, {k, j + 1, n}]]
这将按照您想要的顺序生成所有3个子集,n
为参数。当然,如果m
不是3,则代码无用,特定m
需要特定代码。这就是为什么我赞成@rici灵活的方法,它对一般m
有效。