传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1076
题目大意
每个物品会等概率出现,且数量无限多
当前出现的物品不被选择那么之后就不会出现
每次该选择物品的条件为已选取了条件中的物品每种至少一个
若选取方案最优,询问期望得分是多少
题解
当前得分期望=上一轮得分期望+这一轮得分m
dp[i,j]:第i轮拿的物品方案为j的最优得分期望
如果我们正着去做,会出现从不合法状态(比如前i个根本无法达到j这种方案),所以从后向前推
如果当前方案j里具备了取k这个物品的条件
那么
dp[i,j]+=max{dp[i+1,j],dp[i+1,j or 1<<(k−1)]+x[k]}
否则
dp[i,j]+=dp[i+1,j]
uses math;
var
f:array[0..200,0..70000]of real;
x,y:array[0..20]of longint;
i,j,k:longint;
n,m,a,b:longint;
begin
readln(n,m);
fillchar(y,sizeof(y),0);
for i:=1 to m do
begin
read(x[i],a);
while a<>0 do
begin
inc(y[i],1<<(a-1));
read(a);
end;
end;
for i:=n downto 1 do
for j:=0 to (1<<m)-1 do
begin
for k:=1 to m do
if (j and y[k])=y[k]
then f[i,j]:=f[i,j]+max(f[i+1,j],f[i+1,j or (1<<(k-1))]+x[k])
else f[i,j]:=f[i,j]+f[i+1,j];
f[i,j]:=f[i,j]/m;
end;
writeln(f[1,0]:0:6);
end.