Cod sursa(job #1228956)

Utilizator smaraldaSmaranda Dinu smaralda Data 15 septembrie 2014 22:51:18
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h>
#include<string.h>

const int NMAX = 18;
int bloc[NMAX], d[1 << NMAX], leftover[1 << NMAX];
bool vis[1 << NMAX];

int main() {
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);
    int n, gmax, i, t, conf, newConf;

    for(t = 1; t <= 3; ++ t) {
        scanf("%d%d", &n, &gmax);
        memset(d, 0, sizeof(d));
        memset(vis, 0, sizeof(vis));
        for(i = 1; i < (1 << n); ++ i)
            leftover[i] = gmax;

        for(i = 0; i < n; ++ i) {
            scanf("%d", &bloc[i]);
            d[1 << i] = vis[1 << i] = 1;
            leftover[1 << i] = gmax - bloc[i];
        }

        for(conf = 1; conf < (1 << n); ++ conf)
            if(vis[conf])
                for(i = 0; i < n; ++ i)
                    if(!(conf & (1 << i))) {
                        newConf = conf | (1 << i);
                        if(leftover[conf] >= bloc[i]) {
                            if(!vis[newConf] || d[newConf] > d[conf] || (d[newConf] == d[conf] && leftover[conf] - bloc[i] > leftover[newConf])) {
                                d[newConf] = d[conf];
                                leftover[newConf] = leftover[conf] - bloc[i];
                                vis[newConf] = 1;
                            }
                        }
                        else {
                            if(!vis[newConf] || d[newConf] > d[conf] + 1 || (d[newConf] == d[conf] + 1 && gmax - bloc[i] > leftover[newConf])) {
                                d[newConf] = d[conf] + 1;
                                leftover[newConf] = gmax - bloc[i];
                                vis[newConf] = 1;
                            }
                        }
                    }

            printf("%d\n", d[(1 << n) - 1]);
    }
    return 0;
}