Mai intai trebuie sa te autentifici.
Cod sursa(job #18545)
| Utilizator | Data | 18 februarie 2007 12:35:26 | |
|---|---|---|---|
| Problema | Ghiozdan | Scor | 6 |
| Compilator | cpp | Status | done |
| Runda | preONI 2007, Runda 2, Clasele 11-12 | Marime | 0.94 kb |
#include <cstdio>
#define FIN "ghiozdan.in"
#define FOUT "ghiozdan.out"
#define MAXN 20005
#define MAXG 75005
long a[MAXN], s[MAXN][3];
long n, i, j, g, max, poz;
int main () {
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%ld %ld", &n, &g);
for (i=1; i<=n; i++) {
scanf("%ld", &a[i]);
}
s[0][0] = 1;
s[0][1] = 0;
s[0][1] = 0;
max = 0;
for (i=1; i<=n; i++)
for (j=max; j>=0; j--)
if (s[j][0] && (!s[j+a[i]][0] || (s[j+a[i]][0] && s[j+a[i]][1] > s[j][1]))) {
s[j+a[i]][0] = 1; s[j+a[i]][1] = s[j][1] + 1; s[j+a[i]][2] = a[i];
if (j+a[i] > max) max = j+a[i];
if (max > g - a[i+1]) max = g - a[i+1];
}
if (max>g) max = g;
for (i=max; i>=0 && (s[i][0] == 0); i--) {
}
printf("%ld ", i);
printf("%ld\n", s[i][1]);
poz = s[i][2];
/* while (poz != 0) {
printf("%ld\n", poz);
poz = s[poz][2];
}*/
return 0;
}
