概率dp (背包+概率) 背包的多一点
题意:XX想抢劫银行,当危险率低于P的时候才能行动,现在给出每家银行的金钱mi和危险率pi,求最多能获得多少金钱;
题解:危险率是P,那么安全率就是1-P,那么XX抢劫的所有银行的安全率之积就不能小于1-P,这样就变成了一个01背包的裸题。
1 #include<cstdio> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 using namespace std; 6 const int maxn=1e2+10; 7 double dp[maxn*100]; 8 double p[maxn];int v[maxn]; 9 int main() 10 { 11 int T; 12 int cnt=0; 13 scanf("%d",&T); 14 while(T--){ 15 double limit;int n;int sum=0; 16 scanf("%lf%d",&limit,&n); 17 limit=1.0-limit; 18 for(int i=1;i<=n;i++){ 19 scanf("%d%lf",&v[i],&p[i]); 20 p[i]=1.0-p[i]; 21 sum+=v[i]; 22 } 23 memset(dp,0,sizeof(dp)); 24 dp[0]=1; 25 for(int i=1;i<=n;i++) 26 for(int j=sum;j>=v[i];j--){ 27 dp[j]=max(dp[j],dp[j-v[i]]*p[i]); 28 } 29 int i; 30 for(i=sum;i>=0;i--) 31 if(dp[i]>=limit) break; 32 printf("Case %d: %d\n",++cnt,i); 33 } 34 return 0; 35 }