Cod sursa(job #993423)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 3 septembrie 2013 19:40:44
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#define MAXN 20
#define MAXCOD 132000
#define INF 2000000000
using namespace std;
ifstream f("zebughil.in");
ofstream g("zebughil.out");

int t=3,n,G,v[MAXN],pd[MAXCOD],ramas[MAXCOD],cod,x,y;
bool mb[MAXN];

bool nextcomb();

int main(){
    int i,j;
    while(t--){
        f>>n>>G;
        for(i=0;i<(1<<n);i++)
            pd[i]=INF;
        for(i=0;i<n;i++){
            f>>v[i];
            pd[1<<i]=1;
            ramas[1<<i]=G-v[i];}
        for(i=2;i<=n;i++){
            cod=0;
            for(j=0;j<i;j++){
                mb[j]=1;
                cod+=(1<<j);}
            do{
                for(j=0;j<n;j++)
                    if(mb[j]){
                        x=pd[cod-(1<<j)];
                        y=ramas[cod-(1<<j)]-v[j];
                        if(y<0){
                            x++;
                            y=G-v[j];}
                        if(x<pd[cod]||(x==pd[cod]&&y>ramas[cod])){
                            pd[cod]=x;
                            ramas[cod]=y;}}}
            while(nextcomb());}
        g<<pd[(1<<n)-1]<<'\n';}
    f.close();
    g.close();
    return 0;
}

bool nextcomb(){
    int i,cnt=0;
    for(i=n-1;mb[i];i--,cnt++){
        mb[i]=0;
        cod-=(1<<i);}
    for(i;i>=0&&!mb[i];i--);
    if(i<0)
        return 0;
    mb[i]=0;
    mb[i+1]=1;
    cod+=(1<<i);
    for(i=i+2;cnt;i++,cnt--){
        mb[i]=1;
        cod+=(1<<i);}
    return 1;}