子集生成-二進位制法
阿新 • • 發佈:2019-01-06
/*演算法思想 例如求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; }