一道集合拆分算法,求java实现

wildfire1 2015-08-06 06:48:55
要求:把一个集合拆分成若干个子集,每个子集的交集必须为空,每个集合的并集是这个集合本身,求输出所有可能的情况。

例如: 用户输入3,即求{1,2,3}这个集合的所有拆分情况。若用户输入4,即求{1,2,3,4}这个集合的所有拆分情况。用户可以输入1-10的整数。

用户输入:3
情况1:拆成{1},{2},{3}
情况2:拆成{1},{2,3}
情况3:{1,3},{2}
情况4:{1,2},{3}
情况5:{1,2,3}
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
豫让_______ 2015-08-10
  • 打赏
  • 举报
回复
不容易啊,折腾出来了- -!自己网上找了个copy方法,原来的也改了下,应该是没问题了。

public static void main(String[] args) {
		System.out.println("输入1-10整数");
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();
		
		List<List<Integer>> list1 = new ArrayList<List<Integer>>();
		List<Integer> list1_1 =  new ArrayList<Integer>();
		list1_1.add(1);
		list1.add(list1_1);
		
		for (int i = 1; i < m; i++) {
			List<List<Integer>> list2 = new ArrayList<List<Integer>>();
			copy(list1,list2);
			for (int j = 0; j < list1.size(); j++) {
				list1.get(j).add(i+1);
			}
			list1.addAll(list2);
			List<Integer> list1_2 =  new ArrayList<Integer>();
			list1_2.add(i+1);
			list1.add(list1_2);
		}
		System.out.println(list1);
	}
	
	  public static void copy(List src,List dest){
	        for (int i = 0 ;i < src.size() ; i++) {
	            Object obj = src.get(i);            
	            if (obj instanceof List){
	                dest.add(new ArrayList());
	                    copy((List)obj,(List)((List)dest).get(i));
	            }else{
	                dest.add(obj);
	            }
	        }
}
Sacrix 2015-08-07
  • 打赏
  • 举报
回复
这个问题 以前讨论过的 http://bbs.csdn.net/topics/250062000
豫让_______ 2015-08-07
  • 打赏
  • 举报
回复
折腾出一个好办法。 比如 1的时候只有1 再加一个元素2的时候只需要在 1的情况下的每个子集都加一个2 然后再加上[2]这个单独的集合即可。后面递归 同理,于是想到了 使用集合里面存集合这个办法,List<List>;但是,集合中的集合再添加元素的时候好像有问题,记得是要重写其中的add方法才能解决...思路应该是正确的但是循环中的listm.get(j).add(j+1);这里的确是过不去的,下班了,楼主有兴趣的话可以研究研究,找下解决add不进去的办法。

public static void main(String[] args) {
		System.out.println("输入1-10整数");
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();
		List<Integer> list =  new ArrayList<Integer>();
		for (int i = 0; i < m; ) {
			list.add(++i);
		}
		List<List<Integer>> list1 = new ArrayList<List<Integer>>();
		List<List<Integer>> listm = new ArrayList<List<Integer>>();
		List<Integer> list1_1 =  new ArrayList<Integer>();
		list1_1.add(1);
		list1.add(list1_1);
		
		for (int i = 1; i < m; i++) {
			for (int j = 1; j < list1.size(); j++) {
				listm.get(j).add(j+1);
			}
			List<Integer> listx =  new ArrayList<Integer>();
			listx.add(i+1);
			listm.add(listx);
			list1.addAll(listm);
		}
		
		
		
		System.out.println(list1);
	}


豫让_______ 2015-08-07
  • 打赏
  • 举报
回复
尝试了下,没想出来。惭愧惭愧=。=想到用递归,感觉还是麻烦。

50,706

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧