南阳理工学院OJ_106_背包问题

很裸的贪心:按价值从大到小sort一下,然后枚举当前最大价值最多往包里放多少(更新m),累加起来就是结果

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
struct point
{
    int v,w;
}p[15];
bool cmp(point a,point b)
{
    return a.v>b.v;
}
int main()
{
 int n,s,m,i;
 cin>>n;
    while(n--)
    {
        scanf("%d%d",&s,&m);
        for(i=0;i<s;++i)
            scanf("%d%d",&p[i].v,&p[i].w);
        sort(p,p+s,cmp);
        int tot=0;
        for(i=0;i<s&&m>0;++i)//若没有物品或者背包容量为空,跳出循环
        {    
           tot+=min(m,p[i].w)*p[i].v; //min很重要
           m-=p[i].w;
        }
        printf("%d\n",tot);
    }
 return 0;
}        

 

posted @ 2013-04-26 09:55  小仪在努力~  阅读(268)  评论(0编辑  收藏  举报