Cod sursa(job #1408999)

Utilizator retrogradLucian Bicsi retrograd Data 30 martie 2015 12:53:58
Problema Zebughil Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<vector>
#include<iostream>

using namespace std;
typedef int var;

ifstream fin("zebughil.in");
ofstream fout("zebughil.out");

var G, N;
var W[20];

bool knapsack(string conf) {
    var totalw = 0;
    //cout << "Apel knapsack : " << conf << '\n';
    for(var i=0; i<conf.size(); i++) {
        char c = conf[i];
        totalw += W[c - '0'];
    }
    return totalw <= G;
}


bool solve(var n, string conf) {
    var no_obj = conf.size();

    //cout << conf << '\n';

    if(n == 1) {
        return knapsack(conf);
    }



    for(var c = 1; c < (1 << no_obj); c++) {

        string str1, str2;

        for(var i=0; i<no_obj; i++) {
            if(c & (1 << i)) {
                str1 += conf[i];
            } else {
                str2 += conf[i];
            }
        }
        bool r1 = solve(n / 2, str1);
        bool r2 = solve(n - (n / 2), str2);

        if(r1 & r2)
            return 1;
    }

    return 0;
}


int main() {

    for(var t=1; t<=3; t++) {
        fin>>N>>G;
        for(var i=1; i<=N; i++) {
            fin>>W[i];
        }

        string full;
        for(var i=1; i<=N; i++) {
            full += (i + '0');
        }

        //cout << full << '\n';

        var rez = 1;

        if(solve(1, full)) {
            fout<<1<<'\n';
        } else {
            for(var i = 8; i; i /= 2) {
                if(rez + i <= N && !solve(rez+i, full))
                    rez += i;
            }
            fout<<rez+1<<'\n';
        }
    }

    return 0;
}