求子集

求一个集合的子集有很多方法,这里用的是组合数学里的方法。

import java.util.*;

public class Test_subset {

	/**
	 * @param args
	 */
	int n = 4;
	int m = 1 << n;

	public List<List<Integer>> subset(int n, int[] sub)

	{
		int s[][] = new int[1 << n][n];
		for (int i = 1; i < (1 << n) - 1; i++) {
			for (int j = 0; j < n; j++) {
				if ((i & (1 << j)) == 0) {
					s[i - 1][j] = 0;
				} else {
					s[i - 1][j] = 1;
				}
			}

		}
		List<List<Integer>> subSet = new ArrayList<List<Integer>>();
		for (int i = 0; i < (1 << n) - 2; i++) {
			List<Integer> temp = new ArrayList<Integer>();
			for (int j = 0; j < n; j++) {
				if (s[i][j] == 1)
					temp.add(sub[j]);

			}
			subSet.add(temp);
		}

		return subSet;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test_subset sub = new Test_subset();
		int set[] = { 1, 2, 3, 4 };
		List<List<Integer>> ls = sub.subset(4, set);
		for (List<Integer> temp1 : ls)

			System.out.println(temp1);

	}

}



这里求的是非空真子集,真子集是除去全集的情况;非空真子集是出去空集的情况;所以有2^n -2种情况。i从2取到(1 << n) - 1。

结果如下:

[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
[4]
[1, 4]
[2, 4]
[1, 2, 4]
[3, 4]
[1, 3, 4]
[2, 3, 4]




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值