狀態壓縮規劃

2021-10-09 18:57:44 字數 1261 閱讀 1726

由於二進位制的兩種狀態,可以用來描述開和關(1和0),故每個數字都可以用來表示乙個特定的狀態.

a[1]

|a[2

] 只要有乙個為正,則為正a[1

]&a[

2] 兩個都要為正,則為正a[1

]^a[

2] 兩個不一樣則為正,否則為負數3(

11)+1

(01)=

4(100)

【問題描述】

糖果店的老闆一共有 m 種口味的糖果**。為了方便描述,我們將 m 種口味編號 1 ∼ m。

小明希望能品嚐到所有口味的糖果。遺憾的是老闆並不單獨**糖果,而 是 k 顆一包整包**。

幸好糖果包裝上註明了其中 k 顆糖果的口味,所以小明可以在買之前就知道每包內的糖果口味。

給定 n 包糖果,請你計算小明最少買幾包,就可以品嚐到所有口味的糖果。

【輸入格式】

第一行包含三個整數 n、m 和 k。

接下來 n 行每行 k 這整數 t1, t2, · · · , tk,代表一包糖果的口味。

【輸出格式】

乙個整數表示答案。如果小明無法品嚐所有口味,輸出 −1。

【樣例輸入】

6 5 3

1 1 2

1 2 3

1 1 3

2 3 5

5 4 2

5 1 2

【樣例輸出】

2

int totalbags,totalcandy,eachbox;

int box[

105]

;//用來儲存每包糖果裡的狀態

int dp[

1<<20]

;//記錄到達該種狀態時,所用的糖果數量

set<

int> s;

while

(scanf

("%d%d%d"

,&totalbags,

&totalcandy,

&eachbox)

) box[m]

=forbag;

//記錄狀態

dp[forbag]=1

;//到該狀態只需要一包糖果即可}}

if(s.

size()

//所有糖果都弄上,都不夠的話直接結束

int ed =(1

<;//如三種,則(1<<3)=(1000)=8-1=7(111)

for(

int m=

0;m)}

狀態壓縮動態規劃

動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...

動態規劃 狀態壓縮

這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...

狀態壓縮動態規劃

我們可以使用乙個01串a來表示乙個集合。對於數x x 0 用ax 0表示它不在該集合中,用ax 1表示它在該集合中。將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。這樣,我們可以使用位運算方便地處理集合的操作。交集兩個集合a...