列舉 子集生成法1

2022-07-01 03:45:11 字數 1015 閱讀 4771

紫書p188-7.3子集生成

1、增量構造法

1 #include2 #include3

using

namespace

std;

4int aim[100];5

int psd[100

];//核心**如下

6int subset(int cur,int n,int

last)//必須使用last元素記錄上層函式新增的最後乙個元素的序號717

return0;

18}1920

intmain()

21

這是最為常用的一種方法,其思路**於c++中"列舉法全排列"的函式設計思路。

2、位向量法

1 #include2 #include3

using

namespace

std;

4int aim[100];5

int psd[100

];6 //該**的核心是利用aim中的0與1情況不同間接地對psd中的值進行挑選

7int subset(int cur,intn)8

15else

1622

return0;

23}24 //其顯著的缺點就是分支太多,遞迴太多,但多數情形下並沒有顯著的影響

2526

intmain()

27

3、二進位制法(從**量的角度而言,這是最簡單的方法)

該方法需要有邏輯運算與位運算基礎,將單獨說明.以下暫時只給出**

->在用二進位制表示子集時,位運算中的按位與、或、異或對應集合中的交、並和對稱差。

1 #include2 #include3

using

namespace

std;4//

以下**用來列印集合的子集

5void subset(int n,ints)6

1213

intmain()

14

Greetings (列舉子集 dp)

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

馬的管轄 列舉子集

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

集合列舉子集 學習筆記

有乙個集合,請輸出它的所有子集。子集,即為被這個這個集合包括的所有集合,包括空集。那麼顯然,假如有 n 個元素,那麼有 2 n 個子集。如何列舉子集呢?首先有乙個顯然的方法 用 2 n 的 dfs 列舉。但這樣有乙個弊端 時空較大,而且比較麻煩。比如乙個動態規劃,你每次轉移都要跑一遍 dfs 時空開...