Cod sursa(job #1308636)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 4 ianuarie 2015 14:56:38
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>

#define NMAX 17

using namespace std;

int n, G;
int a[NMAX];
int Dp[(1 << NMAX)], Sum[(1 << NMAX)], Viz[(1 << NMAX)];

int main(){
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);
    int T = 3;
    while(T){
        --T;
        scanf("%d %d", &n, &G);
        for(int i = 0; i <= (1 << n); ++i)
            Dp[i] = Viz[i] = 0;
        for(int i = 1; i <= (1 << n); ++i)
            Sum[i] = G;
        for(int i = 0; i < n; ++i)
            scanf("%d", &a[i]);
        for(int i = 0; i < n; ++i){
            Dp[1 << i] = Viz[(1 << i)] = 1;
            Sum[1 << i] = G - a[i];
        }
        for(int Mask = 1; Mask < (1 << n); ++Mask)
            for(int i = 0; i < n; ++i)
                if(Mask & (1 << i) > 0){
                    int NewMask = Mask | (1 << i);
                    if(Sum[Mask] >= a[i]){
                        if(!Viz[NewMask] || Dp[NewMask] > Dp[Mask] || (Dp[NewMask] == Dp[Mask] && Sum[Mask] - a[i] > Sum[NewMask])){
                            Dp[NewMask] = Dp[Mask];
                            Sum[NewMask] = Sum[Mask] - a[i];
                            Viz[NewMask] = 1;
                        }
                    }
                    else
                        if(!Viz[NewMask] || Dp[NewMask] > Dp[Mask] + 1 || (Dp[NewMask] == Dp[Mask] + 1 && G - a[i] > Sum[NewMask])){
                            Dp[NewMask] = Dp[Mask] + 1;
                            Sum[NewMask] = G - a[i];
                            Viz[NewMask] = 1;
                        }
                }
        printf("%d\n", Dp[(1 << n) - 1]);
    }
}