http://acm.hdu.edu.cn/showproblem.php?pid=2955
类似hdu1203 也是概率题
只需知道 p逃走=1-p抓住
所以先算出每个钱数所代表的最大逃走概率,在最后跟 1-m 比较
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #define mem(a) memset(a,0,sizeof(a)) 8 using namespace std; 9 10 int main() 11 { 12 int n,w[10005],t; 13 double m,c[10005],f[10005]; 14 while(cin>>t) 15 { 16 while(t--) 17 { 18 cin>>m>>n; 19 int sum=0; 20 for(int i=0;i<n;i++) 21 {cin>>w[i]>>c[i]; sum+=w[i];} 22 for(int i=0;i<=sum;i++) 23 f[i]=0; 24 f[0]=1;//使得(1-c[i])有值可乘 25 for(int i=0;i<n;i++) 26 { 27 for(int k=sum;k>=w[i];k--) 28 { 29 f[k]=max(f[k],f[k-w[i]]*(1-c[i])); //每个钱数最大的逃走概率 30 } 31 } 32 for(int i=sum;i>=0;i--) 33 { 34 35 cout<<f[i]<<endl; //1-m为逃走的概率 36 } 37 for(int i=sum;i>=0;i--) 38 { 39 40 if(f[i]>1-m) {cout<<i<<endl;break;} //1-m为逃走的概率 41 } 42 43 } 44 } 45 return 0; 46 }