集合的所有子集

N个元素的集合的所有子集个数为2N个。

public ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set, int index){

ArrayList<ArrayList<Integer>> allsubsets;

if(index==0){//终止,加空集合

allsubsets = new ArrayList<arrayList<Integer>>();

allsubsets.add(new ArrayList<Integer>());//加个空集合

}

else{

allsubsets = getSubsets(set,index-1);

int item = set.get(index);

ArrayList<ArrayList<Integer>> moresubsets = new ArrayList<ArrayList<Integer>>();

for(ArrayList<Integer> subset : allsubsets){

ArrayList<Integer> newsubset = new ArrayList<Integer>();

newsubset.addAll(subset);

newsubset.add(intem);

moresubsets.add(newsubset);

}

allsubsets.addAll(moresubsets);

}

return allsubsets;

}

时间: 2024-10-10 13:01:35

集合的所有子集的相关文章

求一个集合的所有子集问题

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31042651 作者:小马 一个包含n个元素的集合,求它的所有子集.比如集合A= {1,2,3}, 它的所有子集是: { {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集). 这种问题一般有两种思路,先说说第一种,递归.递归肯定要基于一个归纳法的思想,这个思想用到了二叉树的遍历,如下图所示: 可以这样理解这张图,从集合A的每

9.9递归和动态规划(四)——返回某集合的全部子集

/** * 功能:返回某集合的全部子集. */ 三种方法: 方法一:迭代 //迭代 /** * 注意:每次增加集合后会改变原来的集合,无法继续从集合中取出元素. * 必须通过一个中间參数moreSubsets来保存中间结果,最后增加allSubsets. * @author Lynne * @param set * @param index * @return */ public static ArrayList<ArrayList<Integer>> getSubsets2(Ar

Java 求集合的所有子集

递归方法调用,求解集合的所有子集. package ch01; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; public class QuerySubSet { public static List<Set<Object>> Query(Set<Object> t

9.9递归和动态规划(四)——返回某集合的所有子集

/** * 功能:返回某集合的所有子集. */ 三种方法: 方法一:迭代 //迭代 /** * 注意:每次加入集合后会改变原来的集合,无法继续从集合中取出元素. * 必须通过一个中间参数moreSubsets来保存中间结果,最后加入allSubsets. * @author Lynne * @param set * @param index * @return */ public static ArrayList<ArrayList<Integer>> getSubsets2(Ar

枚举一个集合的所有子集

一个神奇的算法,在题目中看到的,单独拿出来整理枚举一个集合S(用一个二进制表示)的所有子集S0: for(int S0 = S; S0; S0 = (S0-1)&S){}

HDU 5363 元素为1~n的集合有多少个子集的元素和为偶数-思维-(快速幂取模)

题意:一个集合有元素1~n,求他的子集满足这样的条件:子集的所有元素的和是偶数,问有多少个这样的子集 分析: 一个排列组合问题.元素和为偶数,那么奇数肯定要调偶数个,偶数就无所谓了,所以偶数有2^(n/2)种选法,再乘以奇数有(C((n+1)/2,0)+C((n+1)/2,2).....)种选法,再减一,除去空集,注意,上面取奇数的时候用的是(n+1)/2(这里是向下取整的除法),是综合n为偶数和n为奇数两种情况. 组合数性质:C(n,1)+C(n,3)+....=C(n,2)+C(n,4)+.

回溯法 求集合全排列、子集

全排列: 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个. 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列. 以对字符串abc进行全排列为例,我们可以这么做:以abc为例固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba固定c,求后面ba的排列:cba,cab. 这个思想和回溯法比较吻合. 代码可如下编

傻瓜方法求集合的全部子集问题(java版)

给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, {a,c}, {b,c}, {a,b,c}}和一个空集. 以下讲的就是怎样用一个原始的傻瓜方法(非算法)求它的全部子集. 首先我们知道是它的子集个数是2^length,假设长度是3,那子集就共同拥有2的3次方=8个,包含空集. 求子集,我的做法是对不论什么一项做推断,有或者无,用1和0来相应表示. 那么像这

[经典算法] 排列组合-N元素集合的所有子集(二)

题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目解析: 如果要产生字典顺序,例如若有4个元素,则: {} => {1} => {1,2} => {1,2,3} => {1,2,3,4} => {1,2,4} => {1,3} => {1,3,4} => {1,4} => {2} => {2,3}