hdu 2955
01背包稍加修改
1 #include<stdio.h> 2 #include<string.h> 3 double max(double x,double y) 4 {return x>y?x:y;} 5 6 double dp[10005]; 7 double per[105]; 8 int mil[105]; 9 int main() 10 { 11 int t; 12 scanf("%d",&t); 13 while(t--) 14 { 15 memset(dp,0,sizeof(dp)); 16 dp[0]=1; 17 int n; 18 double p; 19 scanf("%lf%d",&p,&n); 20 p=1-p; 21 int sum=0; 22 for(int i=0;i<n;i++) 23 { 24 scanf("%d%lf",&mil[i],&per[i]); 25 per[i]=1-per[i]; 26 sum+=mil[i]; 27 } 28 29 for(int i=0;i<n;i++) 30 { 31 for(int j=sum;j-mil[i]>=0;j--) 32 { 33 if(dp[j]<dp[j-mil[i]]*per[i]) 34 dp[j]=dp[j-mil[i]]*per[i]; 35 } 36 } 37 for(int j=sum;j>=0;j--) 38 { 39 if(dp[j]>p) 40 { 41 printf("%d\n",j); 42 break; 43 } 44 } 45 } 46 return 0; 47 }