7. 抢劫银行
题目ID:7158必做题100分
最新提交:
*Wrong Answer
40 分
历史最高:
Wrong Answer
40 分
*
时间限制: 1000ms
空间限制: 512000kB
题目描述
一个劫匪要去抢劫n家银行,每家银行有一定的现金,每抢一家银行该劫匪有一定几率被警察抓住,但是当该劫匪连续作案被抓住的几率小于p时他就可以逃脱,问该劫匪在不被捕的情况下最多能抢到多少钱?
输入格式
第一行为用例组数T,每组用例第一行为一个浮点数P和一个整数n分别表示被捕的几率上限以及该劫匪计划抢劫的银行数量,之后n行每行一个整数M和一个浮点数p表示该家银行的现金数以及该劫匪抢劫该家银行被捕的几率。
0<T≤1000<T≤100
0.0≤P≤1.00.0≤P≤1.0
0<n≤1000<n≤100
0≤Mj≤1000≤Mj≤100
0.0≤pj≤1.00.0≤pj≤1.0
输出格式
对于每组用例,输出该劫匪在不被捕的情况最多能抢到多少钱
样例
Input 1
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Output 1
2 4 6
#include<bits/stdc++.h>
using namespace std;
int m[110];
double p[110];
double dp[10010];
int main(){
int t;
cin>>t;
while(t--){
double P;
int n;
cin>>P>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>m[i]>>p[i];
sum+=m[i];
p[i]=1.0-p[i];
}
fill(dp,dp+sum+1,0.0);
dp[0]=1.0;
for(int i=1;i<=n;i++)
for(int j=sum;j>=m[i];j--)
if(dp[j-m[i]]>0)
dp[j]=max(dp[j],dp[j-m[i]]*p[i]);
for(int j=sum;j>=0;j--){
if(dp[j]>=1.0-P){
cout<<j<<endl;
break;
}
}
}
return 0;
}