Cod sursa(job #2121571)

Utilizator Alex18maiAlex Enache Alex18mai Data 3 februarie 2018 21:10:17
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>

using namespace std;

ifstream cin ("zebughil.in");
ofstream cout ("zebughil.out");

const int inf = 1e9;

long long val[20];
int dp[1 << 17];

int BIT[20];

int MASK , CONT;

void backt(int bit , int val){

    if (val > MASK){
        return;
    }

    if (bit == CONT){
        dp[MASK ^ val] = min (dp[MASK ^ val] , dp[MASK] + dp[val]);
        return;
    }

    backt(bit + 1 , val);
    backt(bit + 1 , val + (1 << BIT[bit]));

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int test = 3;

    while (test--){

        int n;
        long long g;
        cin>>n>>g;

        for (int i=1; i<=n; i++){
            cin>>val[i];
        }

        for (int mask = 0; mask < (1 << n); mask++){
            dp[mask] = inf;
            long long sum = 0;
            for (int bit = 0; bit < n; bit++){
                if ((1 << bit) & mask){
                    sum += val[bit + 1];
                }
            }
            if (sum <= g){
                dp[mask] = 1;
            }
        }

        for (int mask = 0; mask < (1 << n); mask++){

            if (mask == inf){
                continue;
            }

            int cont = 0;

            int now = (1 << n) - 1;
            now ^= mask;

            for (int bit = n - 1; bit >= 0; bit--){
                if ((1 << bit) & now && (1 << bit) <= mask){
                    BIT[cont] = bit;
                    cont++;
                }
            }

            MASK = mask;
            CONT = cont;

            backt(0 , 0);

        }

        cout<<dp[(1 << n) - 1]<<'\n';

    }

    return 0;
}