相关数学知识:子集个数公式:n个元素就有2^n个子集,因为每个元素在子集中只有两种状态:有或没有 。
代码如下:
今天在研究最佳调度问题时突然加深理解了子集和回溯,其实dfs里else中的代码可以替换成如下代码,一样行得通。
for(int j=0;j<2;j++){//j代表有几种选择 x[i]=j; dfs(a,n,i+1,x); } import java.util.Scanner; public class 求所有子集 { //子集个数公式:n个元素就有2^n个子集 //因为每个元素在子集中只有两种状态:有或没有 static void dfs(int[] a,int n,int i,int x[]){ if(i>=n){ //输出一个解 System.out.print("{"); for(int j=0;j<n;j++){ if(x[j]==1){ System.out.print(a[j]+" "); } } System.out.println("}"); } else{ x[i]=0;//不选 dfs(a,n,i+1,x); x[i]=1;//选择 dfs(a,n,i+1,x); } } public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner in=new Scanner(System.in); int a[]={1,2,3}; int x[]=new int[a.length];//记录子集,有就置为1 dfs(a,a.length,0,x); } }