Pagini recente » Cod sursa (job #2981633) | Cod sursa (job #1745564) | Cod sursa (job #412564) | Cod sursa (job #1979196) | Cod sursa (job #1885095)
#include<stdio.h>
#define G 75010
#define N 20001
#define INF 2000000000
struct lab{
int prev1, prev2, minim;
} obj[G];
int v[N];
void qsort (int begin, int end){
int inc,sf;
int pivot, aux;
inc = begin; sf = end;
pivot = v[(inc + sf)/2];
while (inc <= sf){
while (v[inc] > pivot)
inc ++;
while (v[sf] < pivot)
sf --;
if (inc <= sf){
aux = v[inc];
v[inc] = v[sf];
v[sf] = aux;
inc ++; sf --;
}
}
if (begin < sf)
qsort (begin, sf);
if (inc < end)
qsort (inc, sf);
}
int main (){
FILE *in, *out;
in = fopen ("ghiozdan.in","r");
out = fopen ("ghiozdan.out","w");
int n,g,i,j,minim,maxim;
fscanf(in,"%d%d",&n,&g);
for (i=1;i<=n;i++)
fscanf(in,"%d",&v[i]);
qsort (1,n);
//obj[i] = nr minim de obj care au greut i
for (i=1;i<=g;i++)
obj[i].minim = INF;
maxim = 0;
for (i=1;i<=n;i++){
for (j=g-v[i];j>=0;j--)
if (obj[j].minim != INF && obj[j+v[i]].minim > obj[j].minim + 1){
obj[j+v[i]].minim = obj[j].minim + 1;
obj[j+v[i]].prev1 = v[i];
obj[j+v[i]].prev2 = j;
if (j+v[i] > maxim)
maxim = j+v[i];
}
}
fprintf (out,"%d %d\n",maxim,obj[maxim].minim);
int poz = maxim;
while (poz != 0){
if (obj[poz].prev1 != 0)
fprintf (out,"%d\n",obj[poz].prev1);
poz = obj[poz].prev2;
}
fclose (in);
fclose (out);
return 0;
}