Pagini recente » Istoria paginii utilizator/sebihutanu | Cod sursa (job #2895891) | Profil mmrst5 | Statistici Stermin Tamara (tamy) | Cod sursa (job #1549096)
#include <iostream>
#include <cstdio>
using namespace std;
const int N_max = 20000;
const int G_max = 75000;
const int INF = 20001;
bool posibil[G_max+1];
int g[N_max+1];
int nr[G_max+1]; //nr[i] == NR MINIM DE OBIECTE CU CARE POT SA FORMEZ GREUTATEA i
int last[G_max+1]; //last[i] == ULTIMUL OBIECT ALES
int N,G;
int Max;
void calcul(int i)
{
if(last[i] == -1) return;
calcul(i - g[last[i]]);
printf("%d\n", g[last[i]] );
}
int main()
{
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
int i, j; bool GASIT;
scanf("%d %d", &N, &G);
for(i = 1; i <= N; i++) scanf("%d", &g[i]);
for(i = 1; i <= G; i++)
{
posibil[i] = false;
nr[i] = INF;
}
posibil[0] = true;
nr[0] = 0;
last[0] = -1;
for(i = 1; i <= N; i++)
{
GASIT = true;
for(j = G; j >= g[i]; j--)
if(posibil[j - g[i]] == true)
{
posibil[j] = true;
if(GASIT == true)
{last[j] = i; GASIT = false;}
if(nr[j - g[i]] != INF && nr[j] > nr[j - g[i]] + 1)
nr[j] = nr[j - g[i]] + 1;
if(Max < j) Max = j;
}
}
printf("%d %d\n", Max, nr[Max]);
//for(i = 0; i <= G; i++) printf("%d ", last[i]);
//printf("\n");
calcul(Max);
return 0;
}