題意:
現在一個人想去搶劫銀行,如果他被抓的概率低於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