Pagini recente » Cod sursa (job #2834031) | Cod sursa (job #867028) | Cod sursa (job #2593749) | Cod sursa (job #1334376) | Cod sursa (job #18226)
Cod sursa(job #18226)
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "ghiozdan.in"
#define out "ghiozdan.out"
#define dim 75001
#define infinit 100001
#define dim2 20001
int a[2][dim], nr[2][dim];
int v[dim2];
int G, N;
int Gmax=0, Nmin=0;
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf( "%d%d", &N, &G );
for ( int i = 1; i <= N; i++ )
{
scanf( "%d", &v[i] );
}
a[0][v[1]] = 1;
// pt Gmax;
for ( int i = 2; i <= N; i++ )
{
a[1][v[i]] = 1;
for ( int j = 0; j <= G-v[i]; j++ )
{
if ( a[0][j] == 1 )
{
if ( a[1][j+v[i]] == 0 )
{
a[1][j+v[i]] = 1;
}
}
}
for ( int j = 0; j <= G; j++ )
{
if ( a[0][j] == 0 && a[1][j] == 1 )
{
a[0][j] = 1;
}
if ( a[0][j] == 1 )
{
if ( j > Gmax ) Gmax = j;
}
}
}
// pt Nmin;
nr[0][v[1]] = 1;
for ( int i = 2; i <= N; i++ )
{
nr[1][v[i]] = 1;
for ( int j = 0; j <= Gmax-v[i]; j++ )
{
if ( nr[0][j] != 0 )
{
if ( nr[1][j+v[i]] > nr[0][j] + 1 || nr[1][j+v[i]] == 0 )
{
nr[1][j+v[i]] = nr[0][j] + 1;
}
}
}
for ( int j = 1; j <= Gmax; j++ )
{
if ( !nr[0][j] || nr[0][j] > nr[1][j] ) nr[0][j] = nr[1][j];
}
}
printf( "%d %d\n", Gmax, nr[0][Gmax] );
}