Code: Select all
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<iostream>
#include<fstream>
#include<numeric>
#include<string>
#include<vector>
#include<cstring>
#include<map>
#include<iterator>
#include<limits>
#include<iomanip>
#define inf 10000000
#define Max(v) *max_element(v.begin(),v.end())
#define Min(v) *min_element(v.begin(),v.end())
#define inp1(x) scanf("%d",&x)
#define inp2(x,y) scanf("%d %d",&x,&y)
#define Unique(v) v.resize(unique(v.begin(),v.end())-v.begin())
#define Sort(v) sort(v.begin(),v.end(),greater<int>());
#define fread() freopen("inp.txt","r",stdin)
#define fwrite() freopen("out.txt","w",stdout)
#define mem(n,m) memset(n,m,sizeof n)
//priority_queue< int, vector<int>, greater<int> > PQ;// keeps in ascending order
// bool operator < ( const node& b ) const
using namespace std;
vector<long>quality[1010],price[1010];
long mx;
int solve(int i,int n,long budget,long q)
{
if(i>n)
{
if(q>mx)
mx=q;
return 0;
}
int j,k;
for(j=0,k=price[i].size();j<k;j++)
{
if(budget-price[i][j]>=0)
{
if(quality[i][j]<q)
solve(i+1,n,budget-price[i][j],quality[i][j]);
else
solve(i+1,n,budget-price[i][j],q);
}
}
return 0;
}
int main()
{
int i,j,k,m,n,p,t;
long b,q;
inp1(t);
while(t--)
{
scanf("%d %ld",&n,&b);
for(i=1;i<=n;i++)
{
quality[i].clear();
price[i].clear();
}
string s1,s2;
map<string,int>mp;
k=0;
while(n--)
{
cin>>s1>>s2;
if(!mp[s1])
mp[s1]=++k;
m=mp[s1];
inp1(p);
cin>>q;
price[m].push_back(p);
quality[m].push_back(q);
}
mx=0;
solve(1,k,b,1000050000);
cout<<mx<<endl;
}
return 0;
}