n个物品(属性有种类,价值,体积)
每个种类的物品挑一个,装入背包(V) , 体积不超V
问最小价值的物品最大是多少?
二分答案,即这个最小价值md
检验: 贪心,只考虑 V[i] >=md 的物品,每个种类挑体积最小的
看能否满足条件
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define N 1003
struct T{
int cost,v;
T(int c,int v):cost(c),v(v){
}
};
vector<T> a[N];
map<string,int> mp;
int n,m,cnt;
int ID(string s){
if(!mp.count(s)) mp[s]=++cnt;
return mp[s];
}
int test(int x){
int i,j,s=0;
for(i=1;i<=cnt;i++){
int mn=m+1;
for(j=0;j<a[i].size();j++)
if(a[i][j].v>=x) mn=min(mn,a[i][j].cost);
if(mn==m+1) return 0;
s+=mn;
if(s>m) return 0;
}
return 1;
}
int main(){
int cas;
cin>>cas;
while(cas--){
cin>>n>>m;
int i,l=0,r;
cnt=0;
mp.clear();
for(i=1;i<=n;i++) a[i].clear();
r=0;
for(i=1;i<=n;i++){
string type,s;
int v,cost;
cin>>type>>s>>cost>>v;
r=max(r,v);
a[ID(type)].push_back(T(cost,v)) ;
}
int ans;
while(l<=r){
int md=(l+r)/2;
if(test(md)) l=md+1,ans=md; else r=md-1;
}
printf("%d\n",ans);
}
}