给定一个集合,输出它的所有子集(JAVA实现)

例如给定一个子集{1,2,3},则它的所有子集为 : {},   {1},   {2},  {3}, {1,2},   {1,3}, {2,3},, {1,2,3}


代码如下: 

/** 
 * @Title: SetUtil.java 
 * @Package  
 * @Description:   给定一个集合,输出所有的子集
 * @author Mr.Simple 
 * @date May 15, 2013 5:01:24 PM 
 * @version V1.0 
 */


public class SetUtil {

	public static int mSetsCount = 1;
	/**
	 * 
	 * @Title: getSubSets
	 * @Description: 给定一个集合,输出所有的子集
	 * @param sets
	 *            给定的子集
	 * @return void 无返回
	 * @throws
	 */
	public static void getSubSets(int[] sets) {

		if (null == sets) {
			println("null == sets");
			return;
		}

		int len = sets.length;
		// 获得所有子集数
		int count = (int) Math.pow(2, len);

		println("空集 : {}");
		// 输出所有子集
		for (int i = 1; i < count; i++) {
			// 将整数转换成字符串,如果前面为0则会被去掉,比如001,则会显示为1
			String binaryStr = Integer.toBinaryString(i);
			print("二进制为: " + binaryStr + ", 对应的子集为: {");
			// 二进制字符串的长度
			int binLen = binaryStr.length() - 1;
			// 遍历二进制字符串,(每次遍历输出一个子集)
			for (int j = len-1; j >= 0 && binLen >= 0; j--, binLen--) {
				// 二进制 数为1的,则输出对应位置的数值
				if (binaryStr.charAt(binLen) == '1') {
					print(sets[j] + ",");
				}
			}
			println("}; ");
			// 子集数加1
			mSetsCount++;
		}
	}

	/**
	 * 
	 * @Title: print
	 * @Description:	输出数据
	 * @param msg		要输出的内容
	 * @return void
	 * @throws
	 */
	private static void print(String msg) {
		System.out.print(msg + "  ");
	}

	/**
	 * 
	 * @Title: println
	 * @Description:	输出数据
	 * @param msg		要输出的内容
	 * @return void
	 * @throws
	 */
	private static void println(String msg) {
		System.out.println(msg + "  ");
	}
	
} // end of class


简单测试类: 

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

/** 
 * @Title: SetUtilTest.java 
 * @Package  
 * @Description:  
 * @author Mr.Simple bboyfeiyu@gmail.com 
 * @date May 15, 2013 6:25:48 PM 
 * @version V1.0 
 */
public class SetUtilTest {


	@Test
	public void testGetSubSets() {
		// test 1
		int[] sets = {1,2,3,4};
		// 获得子集数
		int count = (int)Math.pow(2, sets.length) ;
		// 测试函数
		SetUtil.getSubSets(sets) ;
		assertEquals(count, SetUtil.mSetsCount) ;
		
		// test 2
		int[] sets2 = {1,2,3};
		SetUtil.mSetsCount = 1;
		SetUtil.getSubSets(sets2) ;
		count = (int)Math.pow(2, sets2.length) ;
		assertEquals(count, SetUtil.mSetsCount) ;
		
		// test 3
		SetUtil.getSubSets(null) ;
	}
	

	

}
  


输出结果为: 

空集 : {}  
二进制为: 1, 对应的子集为: {  4,  };   
二进制为: 10, 对应的子集为: {  3,  };   
二进制为: 11, 对应的子集为: {  4,  3,  };   
二进制为: 100, 对应的子集为: {  2,  };   
二进制为: 101, 对应的子集为: {  4,  2,  };   
二进制为: 110, 对应的子集为: {  3,  2,  };   
二进制为: 111, 对应的子集为: {  4,  3,  2,  };   
二进制为: 1000, 对应的子集为: {  1,  };   
二进制为: 1001, 对应的子集为: {  4,  1,  };   
二进制为: 1010, 对应的子集为: {  3,  1,  };   
二进制为: 1011, 对应的子集为: {  4,  3,  1,  };   
二进制为: 1100, 对应的子集为: {  2,  1,  };   
二进制为: 1101, 对应的子集为: {  4,  2,  1,  };   
二进制为: 1110, 对应的子集为: {  3,  2,  1,  };   
二进制为: 1111, 对应的子集为: {  4,  3,  2,  1,  };   


空集 : {}  
二进制为: 1, 对应的子集为: {  3,  };   
二进制为: 10, 对应的子集为: {  2,  };   
二进制为: 11, 对应的子集为: {  3,  2,  };   
二进制为: 100, 对应的子集为: {  1,  };   
二进制为: 101, 对应的子集为: {  3,  1,  };   
二进制为: 110, 对应的子集为: {  2,  1,  };   
二进制为: 111, 对应的子集为: {  3,  2,  1,  };   


null == sets  



子集和问题是一个经典的计算机科学问题,它可以用来解决集合中元素的组合问题。在Java中,可以使用递归算法来解决子集和问题。 以下是一个简单的Java代码示例,用于计算一个给定数组中是否存在一个子集,使得所有元素的和等于给定的目标值: ``` public class SubsetSum { static boolean isSubsetSum(int[] set, int n, int sum) { // 如果目标值为0,则找到一个子集,所有元素的和为0 if (sum == 0) return true; // 如果没有元素,无法形成子集,返回false if (n == 0 && sum != 0) return false; // 如果最后一个元素大于目标值,则舍弃它 if (set[n - 1] > sum) return isSubsetSum(set, n - 1, sum); // 递归地考虑两种情况 // a) 最后一个元素包含在子集中 // b) 最后一个元素不包含在子集中 return isSubsetSum(set, n - 1, sum) || isSubsetSum(set, n - 1, sum - set[n - 1]); } public static void main(String[] args) { int[] set = { 3, 34, 4, 12, 5, 2 }; int sum = 9; int n = set.length; if (isSubsetSum(set, n, sum) == true) System.out.println("存在一个子集,使得所有元素的和等于 " + sum); else System.out.println("不存在一个子集,使得所有元素的和等于 " + sum); } } ``` 在这个例子中,我们使用了一个名为`isSubsetSum()`的静态方法来计算是否存在一个子集,使得所有元素的和等于给定的目标值。该方法采用三个参数: - `set`:一个整数数组,表示要查找的集合 - `n`:整数,表示要考虑的集合元素的数量 - `sum`:整数,表示要查找的目标和 该方法使用递归算法来考虑两种情况: - 最后一个元素包含在子集中 - 最后一个元素不包含在子集中 如果其中任何一种情况返回`true`,则存在一个子集,使得所有元素的和等于给定的目标值。否则,不存在这样的子集
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值