题解(推它!)
2026-02-08 21:46:16
发布于:湖南
1阅读
0回复
0点赞
很明显的一道 dp :
f i,j,k=成功的期望值
为总挑战数, 为胜利场数, 为背包容量。
代表背包仍有剩余的空间, 代表目前仍有$ −k$ 个地图残片还未装入,由于下标不能为负数且 ,所以直接将 加上 即可。
每次共有两种决策:若第 次挑战胜利

代码:
#include <bits/stdc++.h>
#define kw 0
using namespace std;
const int N=210;
int n,l,k,a[N];
double ans,p[N],f[N][N][N*2];
int main(){
scanf("%d%d%d",&n,&l,&k);
for(int i=1;i<=n;i++){
scanf("%lf",&p[i]);
p[i]=1.0*p[i]/100;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
f[0][0][200+min(n,k)]=1;//注意边界
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++){
for(int k=0;k<=400;k++){
f[i][j][k]+=f[i-1][j][k]*(1-p[i]);
if(j>0&&k-a[i]>=0) f[i][j][k]+=f[i-1][j-1][k-a[i]]*p[i];
}
}
}
for(int i=l;i<=n;i++){
for(int j=200;j<=400;j++){
ans+=f[n][i][j];
}
}
printf("%.6lf",ans);
return kw;
}
这里空空如也






有帮助,赞一个