子集生成-二進制法



/*算法思想 
	例如求4個元素 3 2 1 0 的子集。
	那麼用二進制的1代表每一位是否選中。
十進制	二進制 
0	 	0000  代表空集
1	 	0001  代表{0}
2	 	0010  代表{1}
3	 	0011  代表{0,1}
4	 	0100  代表{2}
		 ...
15	 	1110  代表{3,2,1}
16	 	1111  代表{3,2,1,0} 

如果n很大的話可以用字符串模擬二進制 
*/
# include <stdio.h>
# include <algorithm>
using namespace std;
//二進制法求子集 
void print_subset(int n,int s){
	for(int i=0;i<n;i++){
		if(s & (1<<i)) //1左移i位,監測s的哪一位爲1,爲1的話輸出 
			printf("%d ",i);
	} 
	printf("\n");
} 
int main() {
	int n=3;
	for(int i=0;i<(1<<n);i++){//1左移n位等價於2^n-1.因爲子集個數2^n-1 
		print_subset(n,i);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章