1 3 15 5 10 2 8 3 9
65
/*
贪心。
部分背包问题。
*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 20;
struct res
{
int v,w;
}arr[maxn];
int s,m;
bool cmp(res x,res y)//价值 从小到大排序
{
return x.v>y.v;
}
int main()
{
int n,i,sum;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&s,&m);
for(i=0;i<s;++i)
{
scanf("%d%d",&arr[i].v,&arr[i].w);
}
sort(arr,arr+s,cmp);
sum=0;
for(i=0;i<s;++i)
{
if(m-arr[i].w>0) //能取完全部都取
{
sum+=arr[i].v*arr[i].w;
m-=arr[i].w;
}
else //不能取完,取一部分
{
sum+=m*arr[i].v;
break;
}
}
printf("%d\n",sum);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/47720513