Cod sursa(job #2700061)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 26 ianuarie 2021 14:12:41
Problema Problema rucsacului Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
// Mihai Priboi

#include <bits/stdc++.h>

#define MAXN 5000
#define MAXG 10000

struct obiect {
  int g, p;
} v[MAXN];

int rucsac[2][MAXG + 1];

int main() {
  FILE *fin, *fout;
  int n, g, i, j;
  fin = fopen( "rucsac.in", "r" );

  fscanf( fin, "%d%d", &n, &g );
  for( i = 0; i < n; i++ )
    fscanf( fin, "%d%d", &v[i].g, &v[i].p );

  fclose( fin );

  // pointers pentru usurinta la schimbarea liniilor
  int *a, *b;
  a = rucsac[1];
  b = rucsac[0];

  // problema rucsacului, pe fiecare pozitie profitul maxim pentru greutatea
  // cel mult egala cu j, folosind primele i obiecte
  for( i = 0; i < n; i++ ) {
    for( j = 1; j <= g; j++ ) {
      a[j] = b[j];

      if( j - v[i].g >= 0 )
        a[j] = std::max( a[j], b[j - v[i].g] + v[i].p );
    }
    std::swap(a, b);
  }

  fout = fopen( "rucsac.out", "w" );
  fprintf( fout, "%d", b[g] );
  fclose( fout );
  return 0;
}