Cod sursa(job #379547)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 2 ianuarie 2010 13:53:41
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define NMAX 17
int D[(1<<NMAX)], S[(1<<NMAX)], R[(1<<NMAX)], v[NMAX];
int n, G;
inline int minim(int x,int y){
	if(x > y) return y;
	return x;
}
inline int maxim(int x,int y){
	if(x < y) return y;
	return x;
}
int main(){
	freopen("zebughil.in", "r", stdin);
	freopen("zebughil.out", "w", stdout);
	int i, j, s;
	for(int t = 3; t; --t){
		scanf("%d %d", &n, &G);
		for(i = 0; i < n; ++i)
			scanf("%d", &v[i]);
		for(i = 1; i < (1<<n); ++i)
			D[i] = n;
		for(i = 1; i < (1<<n); ++i){
			for(j = 0, s = 0; (1<<j) <=i; ++j) 
				if(i & (1<<j)) s += v[j];
			//if(s == 0) s = v[j-1];
			S[i] = s;
			if(s <= G) {
				D[i] = 1;
				R[i] = G - S[i];
				continue;
			}
			s = 0;
			for(j = 0; (1<<j) < i; ++j)
				if(R[i - (1<<j)] >= v[j]) 
					if(D[i - (1<<j)] < D[i]){
						D[i] =  D[i - (1<<j)];
						s = R[i - (1<<j)] - v[j];
					}
					else if(D[i - (1<<j)] == D[i]) s = maxim(s, R[i - (1<<j)] - v[j]);
					else ;
				else if(D[i] > D[i - (1<<j)] + 1){
					D[i]  = D[i - (1<<j)] + 1;
					s = G - v[j];
				}
				else if(D[i] == D[i - (1<<j)] + 1) s = maxim(s, G - v[j]);
			R[i] = s;
		}
		printf("%d\n", D[(1<<n)-1]);
	}
	return 0;
}