1 #include<iostream>
2 #include<cstdlib>
3 #include<cstdio>
4 #include<algorithm>
5 using namespace std;
6 struct Pro
7 {
8 int Weight,Price;//重量,价值
9 double dwprice;//单位重量的价值
10 }Metal[109];
11 bool cmp(Pro a,Pro b)
12 {
13 return a.dwprice>b.dwprice;//将单位重量价值按降序排列
14 }
15 int main()
16 {
17 int T,w,s;
18 scanf("%d",&T);//输入测试几组数据
19 while(T--)
20 {
21 double sum=0;
22 scanf("%d%d",&w,&s);
23 for(int i=1;i<=s;i++)
24 {
25 scanf("%d%d",&Metal[i].Weight,&Metal[i].Price);
26 Metal[i].dwprice=(double)Metal[i].Price/Metal[i].Weight;//注意转成double;计算单位重量的价值
27 }
28 sort(Metal+1,Metal+s+1,cmp);//快排
29 for(int i=1;i<=s;i++)
30 {
31 if(Metal[i].Weight>=w&&w)//如果当前种类金属的总重量大于背包的能装的重量;
32 {
33 sum+=w*Metal[i].dwprice;//将背包全部装这种类型的金属;(将金属割开)
34 w=0;//背包就满了
35 }
36 if(Metal[i].Weight<w)//如果当前种类金属的重量小于背包能装的重量
37 {
38 w-=Metal[i].Weight;//就全部放进去进行了,不用割了,背包能放的重量减少
39 sum+=Metal[i].Price;//加上这个种类金属的总价值;因为没有分割所以直接全加上就行
40 }
41 }
42 printf("%.2lf
",sum);
43 }
44 return 0;
45 }