原题链接

1225:金银岛

参考代码

#include<bits/stdc++.h>
using namespace std;
struct gold{//定义一个结构体,金属 
	int num;
	int value;
	double perValue;
}a[105];
//比较规则:单位价值高的排前面 
bool cmp(gold a, gold b){
	return a.perValue>b.perValue;
}
int main(){
	///1.输入 
	int n;
	cin>>n;//几组测试数据 
	int weight;//口袋最大承重
	int m; //金属的数量 
	
	for(int i=1; i<=n; ++i){
		cin>>weight;
		cin>>m;
		for(int j=1; j<=m; ++j)
		{
			cin>>a[j].num>>a[j].value;
			a[j].perValue=a[j].value/(double)a[j].num;
		}
		//2.排序 
		sort(a+1,a+m+1,cmp); 
		//3.拿金属 
		double total=0;//总价值 
		for(int j=1; j<=m; ++j){
			//口袋有空间,则先拿最值钱的,依次类推
			if(weight-a[j].num>0){
				total+=a[j].value;
				weight=weight-a[j].num;
			}
			else{
				total+=weight*a[j].perValue;//如果空间不够,只拿部分 
				break;
			}
		}
		printf("%.2lf\n",total);
	}
	return 0;
}