Cod sursa(job #18453)

Utilizator vlad_popaVlad Popa vlad_popa Data 18 februarie 2007 12:15:41
Problema Ghiozdan Scor 30
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.02 kb
using namespace std;

#include <cstdio>
#include <algorithm>

#define FIN "ghiozdan.in"
#define FOUT "ghiozdan.out"
#define NMAX 20001
#define GMAX 75001
#define INF 0x3f3f3f3f

int val[NMAX], N, K, s1[GMAX], s2[GMAX];

int minim (int x, int y)
{
  if (x > y)
    return y;
  return x;
}

int
 main ()
{
  int i, j;
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);

  scanf ("%d%d", &N, &K);
  for (i = 1; i <= N; ++ i)
    scanf ("%d", &val[i]);
  for (i = 0; i <= K; ++ i)
    s1[i] = INF;
  for (i = 1; i <= N; ++ i)
   {
     s2[val[i]] = 1;
     for (j = 1; j <= K; ++ j)
       if (s2[j] != 1)
         if (j > val[i])
           s2[j] = minim (s1[j], s1[j - val[i]] + 1);
         else
           s2[j] = s1[j];
     for (j = 1; j <= K; ++ j)
      {
        s1[j] = s2[j];
        s2[j] = INF;
      }
     s1[0] = s2[0] = INF;
   }
  for (i = K; i >= 1; -- i)
    if (s1[i] < INF)
     {
       printf ("%d %d\n", i, s1[i]);
       break;
     }
  return 0;
}