Pagini recente » Cod sursa (job #409716) | Cod sursa (job #889286) | Cod sursa (job #1616377) | Cod sursa (job #858611) | Cod sursa (job #18273)
Cod sursa(job #18273)
#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 t[2][dim];
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;
if ( v[i] > G ) continue;
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;
t[0][v[1]] = 1;
for ( int i = 2; i <= N; i++ )
{
nr[1][v[i]] = 1;
t[1][v[i]] = i;
if ( v[i] > Gmax ) continue;
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;
t[1][j+v[i]] = i;
}
}
}
for ( int j = 0; j <= Gmax; j++ )
{
if ( nr[0][j] == 0 || nr[0][j] > nr[1][j] && nr[1][j] != 0 ) nr[0][j] = nr[1][j], t[0][j] == t[1][j];
}
}
/* for ( int i = 0; i <= 1; i++ )
{
for ( int j = 1; j <= Gmax; j++ )
{
printf(" | %d %d %d | ", j, a[i][j], t[i][j] );
}
printf("\n");
}*/
printf( "%d %d\n", Gmax, nr[0][Gmax] );
/*
int val = Gmax;
int i = t[1][Gmax];
int ok = 1;
*/
}