Cod sursa(job #8391)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 24 ianuarie 2007 18:33:53
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 15;
const int MMAX = 7680;

int N, M, R, C;
bool W;
int V;
int A[NMAX][MMAX];
int SMAX;

void read() {
	FILE *fin = fopen("elimin.in", "rt");
	int i, j;

	fscanf(fin, " %d %d %d %d", &N, &M, &R, &C);

	if (M < N) W = true;

	for (i = 0; i < N; ++i)
		for (j = 0; j < M; ++j)
			if (W)
				fscanf(fin, " %d", &A[j][i]);
			else
				fscanf(fin, " %d", &A[i][j]);

	if (W) swap(N, M), swap(R, C);

	fclose(fin);
}

void wipe() {
	int T[MMAX];
	int i, j, sm;

	memset(T, 0, sizeof(T));

	for (i = 0; i < N; ++i)
		if ((V & (1 << i)) == 0)
			for (j = 0; j < M; ++j)
				T[j] += A[i][j];
	
	sort(T, T + M);

	for (sm = 0, i = C; i < M; ++i) 
		sm += T[i];
	
	SMAX >?= sm;
}

void select(int k, int last) {
	if (k == R)
		wipe();
	else {
		int i, stop;
		stop = N - R + 1 + k;

		for (i = last + 1; i < stop; ++i) {
			V |= 1 << i;
			select(k + 1, i);
			V &= ~(1 << i);
		}
	}
}

void write() {
	FILE *fout = fopen("elimin.out", "wt");

	fprintf(fout, "%d\n", SMAX);

	fclose(fout);
}

int main() {
	
	read();

	select(0, -1);

	write();

	return 0;
}