Cod sursa(job #1178299)

Utilizator danalex97Dan H Alexandru danalex97 Data 26 aprilie 2014 14:48:55
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#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();
}