最开始你有 K 的容积,有 n 轮比赛,
每轮比赛胜率为 pi,比赛分为两种(具体种类有输入给出,若 ai≥1 则为第一种,若 ai=−1ai=−1 则为第二种),
第一种的奖品是增加 A[i] 的容积,第二种奖品是获得一个物品,体积为 1,
n 轮比赛结束后所有物品都能被装下的方案才是合法方案(即容积大于等于物品个数),
问赢得比赛总场数大于等于 ll 时方案合法的概率
f[i][j][k] 前i个,胜利场数j, 体积为k 的方案合法的概率
f[i+1][j][k]+= f[i][j][k] *(1-p[i] )
f[i+1][j][k] += f[i][j+1][ min( k+a[i] ,n) ] * p[i ]
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
const int N =203;
struct T{
int v;
double p;
}a[N];
int cmp(T &x,T &y){
return x.v>y.v;
}
double f[N][N][N];
int n,L,K;
void solve(){
int i,j,k;
f[0][0][min(n,K)] =1.0;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
for(k=0;k<=n;k++){
f[i+1][j][k] += f[i][j][k]*(1-a[i+1].p);
if(k+a[i+1].v>=0)
f[i+1][j+1][min(k+a[i+1].v,n)]+= f[i][j][k]*a[i+1].p;
}
double ans= 0;
for(i=L;i<=n;i++)
for(j=0;j<=n;j++) ans+=f[n][i][j];
printf("%0.10lf", ans);
}
signed main(){
cin>>n>>L>>K;
for(int i=1;i<=n;i++) cin>>a[i].p,a[i].p/=100.0;
for(int i=1;i<=n;i++) cin>>a[i].v ;
sort(a+1,a+1+n,cmp);
solve();
}
浙公网安备 33010602011771号