题意:
Roy 去抢N个银行,去抢第j个银行时能得到Mj的钱,被抓的概率为Pj。
问在被抓的概率不大于P时能抢到的最多的钱是多少。
1 #include <iostream> 2 #include <cstdio> 3 #include <map> 4 #include <cstring> 5 using namespace std; 6 const int Ni = 110; 7 int money[Ni]; 8 double dp[10100]; 9 double pro[Ni]; 10 int dcmp(double a,double b) 11 { 12 if(a-b>1e-7) return 1; 13 if(b-a>1e-7) return -1; 14 return 0; 15 } 16 int main() 17 { 18 int t,n; 19 double p; 20 cin>>t; 21 while(t--) 22 { 23 scanf("%lf%d",&p,&n); 24 int sum=0; 25 for(int i=1;i<=n;i++) 26 { 27 scanf("%d%lf",money+i,pro+i); 28 sum+=money[i]; 29 } 30 memset(dp,0,sizeof(dp)); 31 dp[0]=1.0; 32 for(int i=1;i<=n;i++) 33 { 34 for(int j=sum;j>=money[i];j--) 35 { 36 dp[j]=max(dp[j],dp[j-money[i]]*(1-pro[i])); 37 } 38 } 39 for(int i=sum;i>=0;i--) 40 { 41 if(dcmp(p,1-dp[i])!=-1) 42 { 43 printf("%d\n",i); 44 break; 45 } 46 } 47 48 } 49 return 0; 50 }