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