背包问题(南阳oj106)(贪心)
原创
©著作权归作者所有:来自51CTO博客作者有点意思.的原创作品,请联系作者获取转载授权,否则将追究法律责任
背包问题
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;
}