Cod sursa(job #674053)

Utilizator balakraz94abcd efgh balakraz94 Data 5 februarie 2012 14:32:07
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define infile "zebughil.in"
#define outfile "zebughil.out"
#define n_max 20
using namespace std;

int N, G;

int a[n_max];

int dp[1<<n_max][n_max];


inline int bit(int mask, int k) { return mask & (1<<k); }

inline int add(int mask, int k) { return mask | (1<<k); }


void citeste()
{
	scanf("%d %d", &N, &G);
	
	for(int i=0;i<N;++i)
			scanf("%d",&a[i]);
}


void rezolva()
{	
	memset(dp, -1, sizeof(dp));
	dp[0][0] = G;
	
	for(int i = 0; i < (1<<N); ++i)
		for(int j = 0; j < N; ++j)
			for(int k = 0; k < N; ++k)
				if(!bit(i,k) && dp[i][j]!=-1)
					if(dp[i][j] >= a[k])
						dp[add(i,k)][j] = max(dp[add(i,k)][j], dp[i][j] - a[k]);
					else
						dp[add(i,k)][j+1] = max(dp[add(i,k)][j+1], G - a[k]);
}


void afiseaza()
{
	for(int i=0;i<N;++i)
		if(dp[(1<<N)-1][i] != -1)
		{
			printf("%d\n",i+1);
			return;
		}	
	printf ("1\n");
}


int main(void)
{
    freopen(infile, "r", stdin);
	freopen(outfile, "w", stdout);
    
	for(int t=1;t<=3;++t)
	{
		citeste();
		rezolva();
		afiseaza();
	}
    
    fclose(stdin);
	fclose(stdout);
    
    return 0;
}