贪心法求解,注意每次要找的是相对最大价值就好啦,写了一个简单的冒泡排序,还是蛮简单的
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct food
{
int F,J;
}FOOD[1010];
double p[1010];
int main()
{
int m,n;
struct food tmp;
while(cin>>m>>n && m != -1 && n != -1)
{
for(int i = 0; i < n; i++)
cin>>FOOD[i].F>>FOOD[i].J;
for(int i = 0; i < n; i++)
p[i] = (double)FOOD[i].F / (double)FOOD[i].J;
double t;
for(int i = 0; i < n; i++)
for(int j = 0; j < n - i - 1; j++)
{
if(p[j] < p[j + 1])
{
tmp = FOOD[j];
FOOD[j] = FOOD[j + 1];
FOOD[j + 1] = tmp;
t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
double val = 0.0;
for(int i = 0; i < n; i++)
{
if(FOOD[i].J <= m)
{
m -= FOOD[i].J;
val += (double)FOOD[i].F ;
}
else
{
val += (double)FOOD[i].F * (double)m / (double)FOOD[i].J;
break;
}
}
printf("%.3f\n",val);
}
return 0;
}