第一次果断吧概率当成背包了,放大100000倍,而且强多家银行的概率是相乘,不是相加啊
将抢的钱数当成背包转移公式:
dp[j]表示在能抢到j百万的时候成功的最大概率
dp[j]=max(dp[j],dp[j-m[i]]*(1-p_bank[i]));
/*************************************************************************
> File Name: hdu2955.cpp
> Author: yang
> Mail:[email protected]
> Created Time: 2014年08月23日 星期六 10:57:47
************************************************************************/
#include<iostream>
#include<stdio.h>
#include<memory.h>
using namespace std;
#define N 105
int main(){
// freopen("in.txt","r",stdin);
int t,n;
double dp[10010];
cin>>t;
int m[N];
double p_bank[N],p_thief;
while(t--){
cin>>p_thief>>n;
int sum=0;
for(int i=0;i<n;i++){
cin>>m[i]>>p_bank[i];
sum+=m[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=sum;j>=m[i];j--){
dp[j]=max(dp[j],dp[j-m[i]]*(1-p_bank[i]));
}
}
for(int i=sum;i>=0;i--){
if(dp[i]>(1-p_thief)){
printf("%d\n",i);
break;
}
}
}
}