Cod sursa(job #2359744)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 1 martie 2019 09:17:45
Problema Ghiozdan Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>
#define maxn 20000
#define maxg 75000
#define pii pair<int,int>
#define fi first
#define se second
#define inf INT_MAX/2-1

using namespace std;

int v[maxn+5];
pii dp[maxg+5]; /// dp[i].fi -- nr de obiecte din rucsac dp[i].se -- ind ult ob adaugat

int main ()
{
  ifstream fin ( "ghiozdan.in" );
  ofstream fout ( "ghiozdan.out" );

  int n, g; fin >> n >> g;

  int i, j, mx = 0;
  for ( i = 1; i <= n; i++ ) fin >> v[i];

  for ( i = 1; i <= g; i++ ) dp[i] = {inf,0};
  dp[0] = {0,1};
  for ( i = 1; i <= n; i++ )
    for ( j = g; j >= v[i]; j-- )
      if ( dp[j-v[i]].se > 0 && (dp[j].fi == inf || (dp[j].fi > dp[j-v[i]].fi + 1 && mx <= j)) )
        dp[j] = {dp[j-v[i]].fi+1,i}, mx = max ( mx, j );

  j = g;
  while ( j > 0 && dp[j].se == 0 ) j--;

  fout << j << ' ' << dp[j].fi << '\n';
  while ( j > 0 )
  {
    fout << v[dp[j].se] << '\n';
    j -= v[dp[j].se];
  }

  fin.close ();
  fout.close ();

  return 0;
}