Pagini recente » Cod sursa (job #248824) | Cod sursa (job #702671) | Cod sursa (job #2485323) | Cod sursa (job #937488) | Cod sursa (job #652353)
Cod sursa(job #652353)
/*
* File: main.c
* Author: mihai
*
* Created on December 23, 2011, 11:47 PM
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define max(a, b) (a) > (b) ? (a) : (b)
/*
*
*/
int main(int argc, char** argv) {
freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
int i, j, k;
const int n, g;
scanf("%d %d", &n, &g);
int a[n];
int **tab[2];
//memset(tab[0], 0, 2 * (g + 1) * sizeof (int));
//memset(tab[1], 0, 2 * (g + 1) * sizeof (int));
tab[0] = (int**) calloc(g + 1, sizeof (int*));
tab[1] = (int**) calloc(g + 1, sizeof (int*));
for (i = 0; i <= g; i++) {
tab[0][i] = (int*) calloc(3, sizeof (int));
tab[1][i] = (int*) calloc(3, sizeof (int));
}
int l = 0;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (j = 0; j < n; j++, l = 1 - l) {
for (i = 0; i <= g; i++) {
if (i - a[j] >= 0) {
if (tab[l][i][0] < tab[l][i - a[j]][0] + a[j]) {
tab[1 - l][i][0] = tab[l][i - a[j]][0] + a[j];
tab[1 - l][i][1] = tab[l][i - a[j]][1] | (int) pow(2, j);
tab[1 - l][i][2] = tab[l][i - a[j]][2] + 1;
} else {
if (tab[l][i][0] == tab[l][i - a[j]][0] + a[j] &&
tab[l][i][2] > tab[l][i - a[j]][2] + 1) {
tab[1 - l][i][0] = tab[l][i - a[j]][0] + a[j];
tab[1 - l][i][1] = tab[l][i - a[j]][1] | (int) pow(2, j);
tab[1 - l][i][2] = tab[l][i - a[j]][2] + 1;
} else {
tab[1 - l][i][0] = tab[l][i][0];
tab[1 - l][i][1] = tab[l][i][1];
tab[1 - l][i][2] = tab[l][i][2];
}
}
} else {
tab[1 - l][i][0] = tab[l][i][0];
tab[1 - l][i][1] = tab[l][i][1];
tab[1 - l][i][2] = tab[l][i][2];
}
}
}
int gmax = tab[l][g][0];
int nmin = tab[l][g][2];
int temp = g;
for (i = g - 1; i >= 0; i--)
if (tab[l][i][0] != gmax)
break;
else
if (tab[l][i][2] < nmin) {
nmin = tab[l][i][2];
temp = i;
}
printf("%d %d\n", gmax, nmin);
// printf("%d %d\n", tab[l][i][0], tab[l][i][1]);
int nr = tab[l][temp][1];
l = 0;
while (nr != 0) {
if (nr % 2 != 0)
printf("%d\n", a[l]);
nr >>= 1;
l++;
}
return 0;
}