ContestHunter #26 B 玩骰子

CH轉移服務器上不去了,鏈接就不貼了。

題目簡述:

擲N枚骰子,若擲到點數分別爲A1,A2,An的[有序]集合,若該集合有一個子集之和爲m,則稱該集合爲好集,問在N枚骰子的所有有序集合中取到一個好集的概率。 N<=9  ,M<=54


官方題解:爆搜+打表  = =


以下題解,雖然不是我想出來的。 (BY:diamondlx)
令n個骰子投出來的數爲 A1,A2..An
A集合的子集能組合出來的數就是A1..An做一次布爾01揹包
這樣的複雜度是 O(6^n*(54*n)) 是要TLE的。


考慮到布爾01揹包其實是隻有01狀態的,最大又只有54位,所以用long long 狀壓一下,令之爲lop!
並且在dfs骰子的值的過程中轉移(一邊dfs一邊轉移):lop | (lop << i ) 轉移是O(1)的!
比如本次枚舉第x個骰子值是 i,下一次dfs就是:
dfs( x + 1 , lop | ( lop << i ) ) ;
最後只用查詢 lop&(1<<m) 是否爲真即可判斷該集合是否有子集和爲m
複雜度 O(6^n)


contesthunter上不去,代碼不貼了。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章