Cod sursa(job #2657491)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 10 octombrie 2020 19:27:41
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

const int INF = 2000000000;
const int NMAX = 132005;

struct elem {
    long long c, gr;
};

long long v[20];
elem dp[NMAX];

int main () {
    freopen ("zebughil.in", "r", stdin);
    freopen ("zebughil.out", "w", stdout);

    for (int l = 1; l <= 3; l++){
        long long n, gmax, p = 1;
        scanf ("%lld%lld", &n, &gmax);
        for (int i = 1; i <= n; i++, p *= 2)
            scanf ("%lld", &v[i]);

        p--;
        for (int i = 1; i <= p; i++)
            dp[i].c = dp[i].gr = INF;
        dp[0].c = 1;

        for (int i = 0; i < p; i++)
            for (int j = 1, k = 1; k <= n; j *= 2, k++)
                if ((i & j) == 0){
                    if (dp[i].gr + v[k] > gmax){
                        if (dp[i | j].c > dp[i].c + 1 ||
                        (dp[i | j].c == dp[i].c + 1 && dp [i | j].gr > v[k])){

                                dp[i | j].c = dp[i].c + 1;
                                dp[i | j].gr = v[k];
                        }
                    }
                    else{
                        if (dp[i | j].c > dp[i].c ||
                        (dp[i | j].c == dp[i].c && dp[i | j].gr > dp[i].gr + v[k])){

                            dp[i | j].c = dp[i].c;
                            dp[i | j].gr = dp[i].gr + v[k];
                        }
                    }
        }

        printf ("%d\n", dp[p].c);
    }
    return 0;
}