Cod sursa(job #652353)

Utilizator luckyme91wiz kid luckyme91 Data 24 decembrie 2011 04:04:11
Problema Ghiozdan Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.64 kb
/* 
 * 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;

}