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上不去,代碼不貼了。。