明显的0 1背包。 被概率 取最小值卡了下。 至少一个学校 换一下就是 1- 一个学校都拿不到
这个题就好做了
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 10000+10
#define INF 1 << 30
struct Offer{
int m;
double x;
};
int main (){
int M,n;
while(scanf("%d%d",&M,&n)){
if(M == 0 && n == 0)
break;
Offer s[MAXN];
for(int i = 1; i <= n; i++){
scanf("%d%lf",&s[i].m,&s[i].x);
s[i].x = 1-s[i].x;
}
double f[MAXN];
for(int i = 0; i <= MAXN; i++)
f[i] = 2;
f[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = M; j >= 0; j--){
if(j-s[i].m >= 0)
f[j] = min(f[j],f[j-s[i].m]*s[i].x);
}
}
double MI = 1;
for(int i = 0; i <= M; i++)
MI = min(MI, f[i]);
printf("%.1lf%%\n",(1-MI)*100);
}
return 0;
}