Cod sursa(job #906798)

Utilizator bDannYdBurileanu Daniel bDannYd Data 7 martie 2013 10:16:24
Problema Energii Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#include<stdlib.h>

int g, w, eg[10001], cg[10001];
int sol[1000], cMin = 0xfffff;

void read() {
	FILE *fin;
	int i;
	
	fin = fopen("energii.in","r");
	fscanf(fin,"%d",&g);
	fscanf(fin,"%d",&w);
	
	for(i = 0; i < g; i++)
		fscanf(fin,"%d %d",&eg[i],&cg[i]);

		fclose(fin);	
}

int existaSol(){
	int s = 0, i;
	
	for(i = 0; i < g; i++) {
		s += eg[i];
		if(s >= w)
			return 1;
	}
	
	return 0;
}

int solutie(int k) {
	int i, s = 0;
	
	for(i = 1; i <= k; i++)
		s += eg[sol[i]];
	//printf("A");
	if (s >= w)
		return 1;
		
	return 0;
}

int valid(int k) {
	int i;
	
	for (i = 1; i < k; i++) 
		if (sol[i] >= sol[k])
			return 0;
	return 1;
}

int ex(int x, int n) {
	int i;
	
	for(i = 0; i < n ; i++)
		if(sol[i] == x)
			return 0;
	return 1;
}

int getCost(int k) {
	int i, c = 0;
	
	for (i = 1; i <= k; i++)
		c += cg[sol[i]];
	if(c < cMin)
		cMin = c;
}

void back(int k) {
	int i;
	/*for(i = 1; i <= k; i++)
		printf("%d(%d) ",eg[sol[i]],cg[sol[i]]);
	printf("\n");
	*/
	for(i = 0; i < g ; i++) {
		sol[k] = i;
		//printf("\n%d ",valid(k));
		if (valid(k)) {
		//	printf("asd");
			if(solutie(k)) 
				getCost(k);
			else
				back(k+1);}
	}
}

void solve() {
	FILE *fout;
	
	fout = fopen("energii.out","w");
	
	if (!existaSol()) {
		fprintf(fout,"-1");
		fclose(fout);
		return;
	}
	else 
		back(1);
	
	fprintf(fout,"%d",cMin);
	
	fclose(fout);
}

int main() {
	
	read();
	solve();
	//printf("%d",cMin);
	return 0;
}