南阳理工学院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; }