Cod sursa(job #567455)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 30 martie 2011 08:42:19
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
# include <fstream>
# include <vector>
# include <algorithm>
using namespace std;
std :: ifstream f ("elimin.in");
std :: ofstream g ("elimin.out");
vector <vector < int > > a;
int s[1000], x[1000];
int n, m, l, c, L, C, sol, i, j;
inline void make (){
	int i, j, st = 0;
	for (i = 1; i <= m; ++i) s[i] = 0;
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= m; ++j)
			s[j] += a[i][j] * (!x[i]);
	sort (s + 1, s + m + 1);
	for (i = m; i > c; --i)
		st = st + s[i];
	if (sol < st) sol = st;
}
inline bool ok (){
	int i, ret = 0;
	for (i = 1; i <= n; ++i)
		ret = ret + x[i];
	return ret == l;
}
void back (){
	int k = 1;
	x[k] = -1;
	do {
		while (x[k] < 1){
			++x[k];
			if (n == k){
				if (ok ()) make ();
			}
			else x[++k] = -1;
		}
		--k;
	} while ( k > 0 );
}
int main (){
	f >> n >> m >> l >> c;
	if (n <= m){
		for (i = 0; i <= n; ++i)
			a.push_back (vector <int> (m + 1));
		for (i = 1; i <= n; ++i)
			for (j = 1; j <= m; ++j)
				f >> a[i][j];
		back ();
	}
	else{
		for (i = 0; i <= m; ++i)
			a.push_back (vector <int> (n + 1));
		for (i = 1; i <= n; ++i)
			for (j = 1; j <= m; ++j)
				f >> a[j][i];
		n ^= m ^= n ^= m;
		l ^= c ^= l ^= c;
		back ();
	}
	g << sol << '\n';
	g.close ();
	return 0;
}