一、算法分析
典型的贪心算法,思路是:计算每个金属的性价比,然后根据性价比进行排序,从高到低尽可能塞入背包,背包满则得到最大值。
二、参考代码
#include "iostream"
#include "iomanip"
#include "algorithm"
using namespace std;
struct metal
{
double w;
double v;
double price;
}a[201];
double comp(metal a1,metal a2)
{
return a1.price>a2.price;
}
int main()
{
int k;
cin>>k;
while(k--)
{
double result=0;
double w;
int s;
cin>>w>>s;
double tempW,tempV;
for(int i=0;i<s;i++)
{
cin>>tempW>>tempV;
a[i].w = tempW;
a[i].v = tempV;
a[i].price = tempV/tempW;
}
sort(a,a+s,comp);
for(int i=0;i<s;i++)
{
if(w>=a[i].w)
{
result+=a[i].v;
w-=a[i].w;
}else //考虑w装下所有金属并有空余
{
result+=w*a[i].price;
break;
}
}
cout<<fixed<<setprecision(2)<<result<<endl;
}
}