子集生成 --二进制法
生活随笔
收集整理的這篇文章主要介紹了
子集生成 --二进制法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
用二進制表示{0,1,2,3...n-1}的子集s;從右往左第i位表示元素i是否在集合s中。圖2表示10100110是如何展示了集合{1,2,5,7}的。
?
注意:為了方便,最右邊的為總是對應(yīng)元素0,而不是元素1;
異或最重要的性質(zhì)就是開關(guān)型---異或兩次相當于沒有異或,即A^B^B=A
根據(jù)圖1不難看出,A&B,A|B和A^B分別對應(yīng)集合的交、并和對稱差。
1 void print_subset(int n,int s)//s的每一位代表所在為位置的數(shù),當為1的時候表示i存在子集中,否則。。。 2 { 3 for(int i=0;i<n;i++) 4 if(s&(1<<i))//位運算中按位與,或,異或?qū)?yīng)集合的交,并和對稱差。 5 printf("%d ",i); 6 printf("\n"); 7 }空集為0,全集{0,1,2,、、、n-1}的二進制為n個1,即十進制的2n-1,遍歷所有,即求出所有的子集
1 for(int i=0;i<(1<<n);i++) 2 print_subset(n,i);?
轉(zhuǎn)載于:https://www.cnblogs.com/WDKER/p/5468375.html
總結(jié)
以上是生活随笔為你收集整理的子集生成 --二进制法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu16.04安装caffe教程
- 下一篇: 激光雷达和毫米波雷达的区别