题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009
小白上的部分背包问题,这里从数学的角度可以认为老鼠能得到的与能兑换到的javabean成正比,与需要付出cat food成反比,因此,得到的粮食/需要付出的猫粮越大,表示这个兑换方案更好,相当于利润。所以我肯定会选择优先兑换最优方案的,一直到无法兑换完全了,就只能兑换部分了,也就是把剩下的猫粮*单位猫粮所能兑换的javabean。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node
{
int in,out;
double benefit;
} Node[1005];
bool cmp(struct Node x,struct Node y)
{
return x.benefit>y.benefit;
}
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
if(m==-1&&n==-1)
break;
for(int i=0; i<n; i++)
{
scanf("%d%d",&Node[i].in,&Node[i].out);
Node[i].benefit=(double)Node[i].in/Node[i].out;
}
sort(Node,Node+n,cmp);
double ans=0.0;
for(int i=0; i<n; i++)
{
if(m>=Node[i].out)
{
ans+=Node[i].in;
m-=Node[i].out;
}
else
{
ans+=m*Node[i].benefit;
break;
}
}
printf("%.3lf\n",ans);
}
return 0;
}