//Robberies /*思路比较巧,如果直接根据题意去想,用被捕的概率来做就比较困难; 基本思路:以钱为容量,在钱相同的情况下逃跑成功的概率要最大*/ #include<stdio.h> #include<string.h> float max(float a,float b); int main() { int t,n,m[105],sum,r; float pro,p[105],dp[10005]; int i,j; while(scanf("%d",&t)!=EOF) { while(t--) { sum=0; memset(dp,0,sizeof(dp)); dp[0]=1; scanf("%f%d",&pro,&n); for(i=0;i<n;i++) { scanf("%d%f",&m[i],&p[i]); p[i]=1-p[i]; sum+=m[i]; } for(i=0;i<n;i++) { for(j=sum;j>=0;j--) { dp[j]=max(dp[j],dp[j-m[i]]*p[i]); } } for(i=sum;i>=0;i--) { if(dp[i]>=(1-pro)) { r=i; break; } } printf("%d\n",r); } } return 0; } float max(float a,float b){ return(a>b?a:b); }
时间: 2024-10-14 10:09:36