算法竞赛模板 概率dp
有n个投资事件,和一个成功概率最低接受值rate。每个投资的价值是c[i],成功概率是p[i](浮点数)。
在保证成功概率≥rate的情况下,使价值最大化。
#include<bits/stdc++.h> #define INF 0x3f3f3f3f #define MAX 100005 using namespace std; double p[MAX],dp[MAX],rate; int c[MAX]; int main() { int n,i,j,t,v; cin>>t; while(t--) { cin>>rate>>n; memset(dp,0,sizeof(dp)); dp[0]=1.0; v=0; for(i=1;i<=n;i++) { scanf("%d%lf",&c[i],&p[i]); v+=c[i]; //所有投资的总和 } for(i=1;i<=n;i++) for(j=v;j>=c[i];j--) //每个价值所对应的最大成功概率 dp[j]=max(dp[j],dp[j-c[i]]*p[i]); for(i=v;i>=0;i--) if(dp[i]>=rate) { printf("%d\n",i); break; } } return 0; }