/* 0-1背包的乘法,到至少一份offer的最大概率: 1 - (1 - p1)* (1 - p2); 一:pro[n] 用n最大得到一份offer的概率, 输出地时候比较让人郁闷的,用两个%% pro[j] = max(pro[j], 1 - (1 - pro[j - cost[i]]) * (1 - offer[i])); 二 :pro[n] 用n最小的不到offer的概率 pro[j] = min(pro[j] , (1 - pro[j - i]) * (1 - offer[i])); 三 :贪心 */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N = 1005; int main() { int n, m; int cost[N]; double offer[N]; double pro[N * 10]; while(cin >> n >> m) { if(n == 0 && m == 0) break; for(int i = 1; i <= m; i++) cin >> cost[i] >> offer[i]; memset(pro, 0 , sizeof(pro)); for(int i = 1; i <= m ; i++) for(int j = n; j >= cost[i]; j--) pro[j] = max(pro[j], 1 - (1 - pro[j - cost[i]]) * (1 - offer[i])); double dd = 100 * pro[n]; printf("%0.1lf%%/n", dd); } }