#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
double dp[10005];
int v[105];
double w[105];
int main(){
int T;
cin>>T;
while(T--){
double P;
int N;
cin>>P>>N;
int sum=0;
memset(dp,0,sizeof(dp));
dp[0]=1;//初始化,当偷0元时逃跑的概率为1;
for(int i=1;i<=N;i++){
cin>>v[i]>>w[i];
sum+=v[i];
}
for(int i=1;i<=N;i++)
for(int j=sum;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]*(1-w[i]));
for(int i=sum;i>=0;i--)
if(dp[i]>=1-P){//从最大容量(最多钱)开始,只要逃跑率满足,则返回最大钱数。
printf("%d\n",i);
break;
}
}
return 0;
}
//因为概率不能直接加和,所以不适合当容量。
//dp[j]表示偷j元时最大的逃跑概率。
//灵活应用
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
double dp[10005];
int v[105];
double w[105];
int main(){
int T;
cin>>T;
while(T--){
double P;
int N;
cin>>P>>N;
int sum=0;
memset(dp,0,sizeof(dp));
dp[0]=1;//初始化,当偷0元时逃跑的概率为1;
for(int i=1;i<=N;i++){
cin>>v[i]>>w[i];
sum+=v[i];
}
for(int i=1;i<=N;i++)
for(int j=sum;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]*(1-w[i]));
for(int i=sum;i>=0;i--)
if(dp[i]>=1-P){//从最大容量(最多钱)开始,只要逃跑率满足,则返回最大钱数。
printf("%d\n",i);
break;
}
}
return 0;
}
//因为概率不能直接加和,所以不适合当容量。
//dp[j]表示偷j元时最大的逃跑概率。
//灵活应用