礼物
有个人经过商店,看见商店里有礼物,有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移去左边,得
∑PiFs=∑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.

本文介绍了一种状态压缩动态规划算法,用于解决特定条件下购买所有礼物的期望次数问题。适用于物品种类不多于20种的情况,通过巧妙的数学转换简化了计算过程。
588

被折叠的 条评论
为什么被折叠?



