列舉子集的幾種方法

2022-03-14 04:44:15 字數 1127 閱讀 2434

程式設計挑戰競賽上156頁說了列舉組合和子集的幾種方法,我覺得挺好的,收藏一下

都是利用二進位制數的模型來進行列舉子集或者組合

下面列舉集合都是在二進位制位上進行列舉。

##列舉k個數的子集

void

eunmset

(int k)

//用k個二進位制位數列舉k個狀態

}

當k等於3時,即eunmset(3)

輸出:000

001010

011100

101110

111

void

enumsubset

(int sup)

/*作用:對於二進位制狀態sup,列舉該狀態的子集*/

while

(sub!=sup)

;/*當sub=0之後 sub=0-1=-1,退出*/}/*

原理:針對sup中的二進位制為1的位開始進行減法,假設有k個二進位制位,那麼像列舉(2^k-1)~0一樣列舉其子集

輸出:狀態為降序輸出

*/

當sup=10101,即十進位制數21

輸出:10101

10100

10001

10000

00101

00100

00001

00000

void

enumk

(int k,

int n)

/*求出總共n個狀態中,有k個狀態為1的所有情況*/

}/*原理:

根據當前的符合要求的狀態求出第乙個大於該狀態的符合要求的狀態

輸出:公升序輸出

演算法描述:

按照字典序的話,最小的子集是(1<

輸入:k=3,n=5

00111

01011

01101

01110

10011

10101

10110

11001

11010

11100

列舉子集的三種方法 紫書

之前一直沒怎麼重視這一塊,理解也是半知半解,現在想想還是得好好記下。一.增量構造法 什麼意思呢,簡單來說就是把乙個乙個元素放進去又拿出來的過程 先上 ass集合的陣列 num子集的陣列 n 集合的元素的個數 cur 初始為0,代表著子集的元素的個數 void print subset int n,i...

Greetings (列舉子集 dp)

題目 題意 給n個信 信封有長寬和數目 問在找最多k種信封型別的時候,最少浪費多少紙 思路 看了看題解,深以為然,這個思路很巧妙,也許是我太菜,沒細想。我們首先二進位制列舉計算出,每種狀態下,這些信合用同一種信封時的浪費數目。然後通過列舉子集,dp i j 代表 i 種信封,現在已經裝了 j 集合的...

馬的管轄 列舉子集

在中國象棋中,馬是走日字的。乙個馬的管轄範圍指的是當前位置以及一步之內能走到的位置,如果一匹馬的某個方向被蹩馬腳,它就不能往這個方向跳了。自行腦補 那麼問題來了,在乙個 n m 的棋盤內,如何用最少的馬管轄住所有 n m 個格仔。比如 n m 3 時,最少要用 5 隻馬才能管轄所有棋盤,一種可能的方...