题目连接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=106
解析:简单贪心,注意题目描述物品是可以分割的,因为单位价值已经给出,所以只需对物品按单位价值排序即可。如果背包剩余容量可以容纳当前物品则直接加上物品价值,否则分割。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int v,w;
}array[15];
bool cmp(const node &a,const node &b)
{
return a.v>b.v;
}
int main()
{
int n,s,m,i,sum;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&s,&m);
sum=0;
for(i=0;i<s;i++)
{
scanf("%d%d",&array[i].v,&array[i].w);
}
sort(array,array+s,cmp);
for(i=0;i<s;i++)
{
if(m>=array[i].w)
{
sum+=array[i].w*array[i].v;
m-=array[i].w;
}
else
{
sum+=m*array[i].v;
break;
}
}
printf("%d\n",sum);
}
return 0;
}