背包问题



3000 ms  |  内存限制: 65535



3




第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;

随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。

输出 输出每组测试数据中背包内的物品的价值和,每次输出占一行。 样例输入

1 3 15 5 10 2 8 3 9

样例输出

65


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct st
{
int a,b;
}data[20];
int cmp(st x,st y)
{
return x.a>y.a;
}
int main()
{
int i,j,v,w,test;
int sum,k;
scanf("%d",&test);
while(test--)
{
scanf("%d %d",&v,&w);
for(i=1;i<=v;i++)
{
scanf("%d %d",&data[i].a,&data[i].b);
}
sort(data+1,data+v+1,cmp);
for(i=1,sum=0;i<=v;i++)
{
k=data[i].a*data[i].b;
if(w-data[i].b>=0)
{
sum+=k;
w-=data[i].b;
}
else
{
sum+=w*data[i].a;
break;
}
}
printf("%d\n",sum);
}
return 0;
}