子集生成詳解

2021-07-16 10:51:54 字數 728 閱讀 1568

演算法入門經典上面有三種子集生成的演算法,我發現有些演算法有些需要注意的地方,寫出來防止被坑。

第一種是增量構造法

#include

int cnt=0;

void print(int

*a,int cur,int n)

}int main(void)

第二種是位向量法

#include//列印出來的不是字典序順序 

void print(int

*a,int cur,int n)

printf("\n");

}else

}int main(void)

第三種是二進位制法

#include

void print(int n,int s)

printf("\n");

}int main(void)

第三種方法的缺點是一旦n超過31,便會溢位,優點是**量少。

第二種方法的缺點是輸出的順序不是字典序,而且速度沒第一種快,優點就是能用。

第一種方法速度快,而且是字典序,只要你陣列能開那麼大,n就能多大。強烈推薦使用第一種方法。

如有不當之處歡迎指出!

生成子集 subset

程式設計師面試金典 上面的一道題目,leetcode也有這道題 返回某集合的所有非空子集。給定乙個int陣列a和陣列的大小int n,請返回a的所有非空子集。保證a的元素個數小於等於20,且元素互異。各子集內部從大到小排序,子集之間字典逆序排序,見樣例。測試樣例 123,456,789 返回 先按公...

子集生成模板

1 子集生成演算法 給定乙個集合,列舉所有可能的子集。2 為了簡單起見,討論的方法中沒有重複元素34 增量構造法 5 include6 include7 void print subset int n,int a,int cur 816 17intmain 18 1 位向量法2 構造乙個位向量b i...

子集生成演算法

劉汝佳書上的內容 下文提到的集合 其元素預設為0 n 1 n 個 意思就是一次選乙個 放到 裡 include include include include include include include include include include include include includ...