假设集合A={a1,a2,…an}有n个元素。
1、基本思路:求解的基本思路与前面介绍的皇后问题的思路基本相同。在这里只需将问题看作是n行2列的棋盘布局问题。第i行的第1列表示子集中包含元素ai,第2列表示不包含元素ai。
在这里没有什么约束条件,只需要往前寻找合适的解,然后回溯一步,再向前进找下一个解,直到找到所有的解。
2、Java代码实现
public class Subset {
int n;
int ct;
int[] x;
// 构造函数
public Subset(int n) {
this.n = n;
this.ct = 0;
x = new int[n];
}
// 递归摆放皇后
public void getAllset (int i) {
if (i == n) {
output ();
ct++;
return;
}
for (int j = 0; j <= 1; j++) {
x[i] = j;
getAllset (i+1);
}
}
// 输出合法解
public void output () {
int[] setA = {2,4,7,6,5};
int i;
System.out.print("(");
for (i = 0; i < n; i++) {
if (x[i] == 0) {
// 皇后问题中,只需要输出位置信息即可
// 但是,在这里需要输出具体的子集
// 所以根据位置信息,输出相应的集合元素即可。
System.out.print(setA[i] + ",");
} else {
System.out.print("");
}
}
System.out.println(")");
}
// 主函数测试
public static void main(String[] args) {
int[] setA = {2,4,7,6,5};
Subset subset = new Subset(setA.length);
subset.getAllset (0);
System.out.println(subset.ct);
}
}
运行结果:
(2,4,7,6,5,)
(2,4,7,6,)
(2,4,7,5,)
(2,4,7,)
(2,4,6,5,)
(2,4,6,)
(2,4,5,)
(2,4,)
(2,7,6,5,)
(2,7,6,)
(2,7,5,)
(2,7,)
(2,6,5,)
(2,6,)
(2,5,)
(2,)
(4,7,6,5,)
(4,7,6,)
(4,7,5,)
(4,7,)
(4,6,5,)
(4,6,)
(4,5,)
(4,)
(7,6,5,)
(7,6,)
(7,5,)
(7,)
(6,5,)
(6,)
(5,)
()
32