Pagini recente » Cod sursa (job #969025) | Cod sursa (job #2380323) | Cod sursa (job #2453343) | Cod sursa (job #455765) | Cod sursa (job #1178299)
#include <fstream>
#include <cstdio>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
ofstream Gg("bani.out");
#define MAXN 1010
#define MAXG 1010
int N, G, Pmax;
int W[MAXN], P[MAXN], T[MAXN];
int D[2][MAXG];
bool U[MAXN][MAXG];
int used[MAXN];
bool cmp(int x,int y)
{
return ( double(P[x])/W[x] ) > ( double(P[y])/W[y] );
}
void solve()
{
memset(W,0,sizeof(W));
memset(P,0,sizeof(P));
memset(T,0,sizeof(T));
memset(U,0,sizeof(U));
memset(used,0,sizeof(used));
scanf("%d%d", &N, &G);
for(int i = 1; i <= N; ++i)
scanf("%d%d%d", &P[i], &W[i] , &T[i]);
int l = 0;
for (int i = 1; i <= N; ++i , l = 1-l)
for (int cw = 0; cw <= G; ++cw)
{
D[l][cw] = D[1-l][cw];
if (W[i] <= cw)
{
if ( D[l][cw] < D[1-l][cw - W[i]] + P[i] )
{
D[l][cw] = D[1-l][cw - W[i]] + P[i];
U[i][cw] = 1;
}
}
}
l = 1-l;
int i = N;
int js = 0, mx = 0;
for (int j=1;j<=G;++j)
if ( D[l][j] > mx )
js = j, mx = D[l][j];
double ans = mx;
int j = js;
while ( i > 0 )
{
if ( U[i][j] )
used[i] = 1, j-=W[i];
i--;
}
vector<int> plus;
for (int i=1;i<=N;++i)
if ( T[i] == 1 && used[i] == 0 )
//if ( T[i] == 1 )
plus.push_back(i);
sort(plus.begin(),plus.end(),cmp);
//G -= js;
//ans = 0;
for (size_t i=0;i<plus.size();++i)
{
int v = min(G,W[plus[i]]);
G -= v;
double x = double( double(P[plus[i]])/W[plus[i]] ) * double(v);
ans += x;
}
Gg<<fixed<<setprecision(9)<<ans<<'\n';
}
int main()
{
freopen("bani.in", "r", stdin);
int t;scanf("%d",&t);
while (t--) solve();
}