题意:
现在一个人想去抢劫银行,如果他被抓的概率低于P的话,那么他就是安全的。
然后给出N,代表他想抢劫的银行的个数,然后N行,有Mj,Pj,代表的是银行有Mj这么多钱,然后被抓的概率是Pj。
然后问你当被抓的概率低于P的时候,叫你输出他能够抢到的最多的钱。
思路:
01背包。然而把概率当容量是不可以的,因为概率是浮点数。
考虑把金钱当容量。
状态表示:f[m]表示获得金钱为m时的成功逃脱概率
转移方程:f[j]=max(f[j],f[j-v[i]]*w[i]) 注意成功逃脱的概率是累乘
代码:
#include<bits/stdc++.h>
using namespace std;
//Life is Short!
const int N=105;
int v[105];
double f[10005],w[105];
int main(){
int T;
cin>>T;
while(T--){
memset(f,0,sizeof f);
f[0]=1;
int n,m=0;
double P;
cin>>P>>n;
P=1-P;
for(int i=1;i<=n;++i){
cin>>v[i]>>w[i];
w[i]=1-w[i];
m+=v[i];
}
for(int i=1;i<=n;++i){
for(int j=m;j>=v[i];--j){
f[j]=max(f[j],f[j-v[i]]*w[i]);
}
}
for(int i=m;i>=0;--i){
if(f[i]>=P){
cout<<i<<endl;
break;
}
}
}
return 0;
}
参考:https://blog.csdn.net/a1097304791/article/details/83586769