礼物
有个人经过商店,看见商店里有礼物,有
n
种,突然间,消费欲暴增,他想买下全部礼物。
每次,店员会按照一定的概率Pi(或者不拿出礼物,不拿出礼物也算一次购买),将第i种礼物拿出来,
问每种 礼物都买到的期望次数。
样例输入
第一行表示
3
0.1
0.2
0.3
样例输出
一行,期望次数。
12.167
数据范围
N
≤20,
题解
看到
我们倒着过来做。
1表示没选,0表示选了,初始化
F0
=0,答案为
F2n−1
。
转移方程为
Fs = ∑ Fs′i * Pi +(1- ∑Pi )* Fs +1
其中
S′i
=
S
- 2i−1
但我们发现一个神奇的现象,转移方程两边都有 Fs ,所以我们把右边的 Fs 移去左边,得
∑Pi Fs = ∑ Fs′i Pi +1
所以
Fs = ∑Fs′i∗Pi+1∑Pi
这样右边就不含
Fs
,可以转移。
答案为
F2n−1
。
Code(Pascal)
var
c:array[0..30] of longint;
n,m,j,l,i,ff:longint;
ans:int64;
k,o,u,yyy,kkk:extended;
f:array[0..2500000] of extended;
p:array[0..100] of extended;
w:array[0..100] of int64;
begin
readln(N);
for i:=1 to n do
readln(p[i],w[i]);
c[1]:=1;
for i:=2 to n do
c[i]:=c[i-1]*2;
for i:=1 to c[n]*2-1 do
begin
k:=0;
for l:=1 to n do
if i and c[l]>0 then
begin
f[i]:=f[i]+f[i-c[l]]*p[l];
k:=k+p[l];
end;
f[i]:=f[i]+1;
f[i]:=f[i]/k;
end;
ans:=0;
for i:=1 to n do
ans:=ans+w[i];
writeln(ans);
writeln(f[c[n]*2-1]:0:3);
end.