思路:将求最大的录取率转化为最小的不录取的概率,然后就是01背包
AC代码:
import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int N=100010;
static int a[]=new int [N];
static double b[]=new double [N], f[]=new double [N];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for(;;) {
int n=sc.nextInt();
int m=sc.nextInt();
if(n==0&&m==0)break;
for(int i=1;i<=m;i++) {
a[i]=sc.nextInt();
b[i]=1-sc.nextDouble();
}
for(int i=0;i<N;i++) f[i]=1;
for(int i=1;i<=m;i++) {
for(int j=n;j>=a[i];j--) {
//System.out.println(f[j-a[i]]*b[i]);
f[j]=Math.min(f[j],f[j-a[i]]*b[i]);
}
}
double min=1;
for(int i=0;i<N;i++) {
min=Math.min(min,f[i]);
}
//System.out.println(Arrays.toString(f));
System.out.println(((int)((1-min)*1000))/10.0+"%");
}
}
}