Cod sursa(job #495490)

Utilizator S7012MYPetru Trimbitas S7012MY Data 25 octombrie 2010 16:48:06
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
/*
 * File:   main.cpp
 * Author: petru
 *
 * Created on 2010-10-25
 */


#include <cstdio>
#include <cstring>
#include <algorithm>
#define deb(n) fprintf(stderr,"%d ",(n));
#define debnl fprintf(stderr,"\n");
#define DN 18
#define LIM 1<<DN
#define MULT 0x3f3f3f3f
using namespace std;

int n,g,v[DN],dp[LIM][DN];

int main()
{
	int i,j,nr,ok;
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);
	for(int ll=1; ll<=3; ++ll) {
		scanf("%d %d",&n,&g);
		for(i=1; i<=n; ++i) scanf("%d",&v[i]);

		int lim=1<<n;
		for(i=0; i<lim; ++i) for(j=0; j<=n; ++j) dp[i][j]=MULT;
		//memset(dp,MULT,sizeof(dp));

        dp[0][1]=0;
		for(i=0; i<lim; ++i) for(j=0; j<=n; ++j) if(dp[i][j]!=MULT)
            for(int t=0; t<n; ++t) {
            	nr=1<<t;ok=nr&i;
            	if(0==ok) {
            	    ok=i|nr;
            	    if(dp[i][j]+v[t+1]<=g) dp[ok][j]=min(dp[ok][j],dp[i][j]+v[t+1]);//mai incape
            	    else dp[ok][j+1]=min(dp[ok][j+1],v[t+1]);//camion nou
            	}
            }
        int sol=n;
        for(i=1; i<=n; ++i) if(MULT!=dp[lim-1][i]) {sol=i; break;}
        printf("%d\n",sol);
	}
	return 0;
}