最开始你有 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 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #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(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!