期望dp
不考虑打的顺序,只要最后能把地图都装下就行了,因此把概率和容量装进一个结构体里面,把地图放后面。
记一个状态f[i][j][k]表示前i个比赛,赢了j场,容量k的期望,转移即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=205;
struct RACE{int a;double p;}a[N];
int n,l,K;
double f[205][205][205];
bool cmp(RACE x,RACE y) {return x.a>y.a;}
int main() {
scanf("%d%d%d",&n,&l,&K);
for(int i=1;i<=n;i++) scanf("%lf",&a[i].p),a[i].p/=100;
for(int i=1;i<=n;i++) scanf("%d",&a[i].a);
f[0][0][min(200,K)]=1;
sort(a+1,a+1+n,cmp);
for(int i=0;i<n;i++) {
for(int j=0;j<=i;j++) {
for(int r=0;r<=n;r++) {
f[i+1][j][r]+=f[i][j][r]*(1-a[i+1].p);
if(r+a[i+1].a<0) continue;
int t=min(r+a[i+1].a,n);
f[i+1][j+1][t]+=f[i][j][r]*a[i+1].p;
}
}
}
double ans=0;
for(int i=0;i<=n;i++) {
for(int j=l;j<=n;j++)
ans+=f[n][j][i];
}
printf("%.6lf",ans);
}