礼物(倒着求期望)[20190716NOIP模拟测试4]
A. 礼物
题目类型:传统 评测方式:文本比较
内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目描述
输入格式
输出格式
样例
数据范围与提示
显然的期望+状态压缩DP
Yu-shi 说正着求概率,倒着求期望
s表示状态,s'表示之前的状态,p[i]表示买到 i 礼物的概率,g表示啥都没买到的概率,f[s]表示状态s的期望次数(表示到(1<<n)-1的期望步数,f[(1<<n)-1]=0)
状转方程为
$f[s]=\sum f[s’]*p[i]+(\sum p[i]+g)*f[s]+1$
移项得 $f[s]=(\sum f[s’]*p[i]+1))/(1-\sum p[i]-g)$
代码代码:
#include<iostream> #include<cstdio> using namespace std; int n,num[1<<25],c[25]; long long ans; double a[25],f[1<<25]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%d",&a[i],&c[i]),ans+=c[i]; for(int i=1;i<=n;i++) num[(1<<i-1)]=i; for(int i=(1<<n)-2;i>=0;i--){ double x=0.0; for(int j=1;j<=n;j++){ int w=1<<(j-1); if(!(i&w)){ x+=a[num[w]]; f[i]+=f[i^w]*a[num[w]]; } } f[i]+=1.0; f[i]/=x; } printf("%lld\n%.3lf\n",ans,f[0]); }
$Will$ $Be$ $The$ $King$