我在制定一种算法时遇到了麻烦,该算法可以从约30个对象的列表中生成每个集合和子集合(包括空集合),每个集合最多包含4个对象。

我正在用Java编写,但是伪代码应该可以。

到目前为止,这是我所做的:

for (int a = 0; a < Objects.length; a++) {
for (int b = a + 1; b < Objects.length; b++) {
for (int c = b + 1; c < Objects.length; c++) {
for (int d = c + 1; d < Objects.length; d++) {
// add Objects[a, b, c, d] to the Set
// do other stuff
}
}
}
}

但是显然这是行不通的,因为它在每个集合中强制使用4个对象(虽然我需要元素较少的子集)。

谷歌搜索这个问题会产生很多答案,但是从来没有一个答案能产生所有子集,并且集合的大小有限制。

参考方案

这应该可以解决问题:

// add the empty set []
for (int a = 0; a < Objects.length; a++) {
// add the set containing (Objects[a])
for (int b = a + 1; b < Objects.length; b++) {
// add the set containing (Objects[a], Objects[b])
for (int c = b + 1; c < Objects.length; c++) {
// add the set containing (Objects[a], Objects[b], Object[c])
for (int d = c + 1; d < Objects.length; d++) {
// add the set containing (Objects[a], Objects[b], Object[c], Object[d])
}
}
}
}

Java:线程池如何将线程映射到可运行对象 - java