Cod sursa(job #1240618)

Utilizator tudi98Cozma Tudor tudi98 Data 11 octombrie 2014 19:28:00
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;


int a[20][4000];
int Sum[20];
bool used[20];

int main(){

	freopen("elimin.in", "r", stdin);
	freopen("elimin.out", "w", stdout);

	int n,m,r,c;
	bool swp = false;
	scanf("%d%d%d%d",&n,&m,&r,&c);
	if(n > m){
		swp = true;	

	}
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			if(swp) scanf("%d",&a[m-j-1][i]), Sum[m-j-1] += a[m-j-1][i];
			else scanf("%d",&a[i][j]),Sum[i] += a[i][j];
		}
	}

	if(swp){
	 	swap(n,m);
	 	swap(r,c);
	}

	int Best = 0;
	int N = 1 << n;
	for(int i = 0; i <= N; i++){
		int R = 0;
		int S = 0;
		for(int j = 0; j <= 15; j++){
			used[j] = false;
			if(i & (1 << j)){
			      R++;
			      S += Sum[j];
			      used[j] = true;
			}	
		} 
		//printf("%d\n%d\n",S,R);
		vector<int> Col;
		if(R == n - r){
			for(int j = 0; j < m; j++){
				int SS = 0;
			 	for(int k = 0; k < n; k++){
			 		if(!used[k]) continue;
			 		SS += a[k][j];
			 	}
			 	Col.push_back(SS);
			}
			sort(Col.begin(),Col.end());
			for(int k = 0; k < c; k++)
				S -= Col[k];
			if(S > Best) Best = S;		
		}
	}

	printf("%d\n",Best);
}