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上不去,代码不贴了。。