Cod sursa(job #150342)

Utilizator andrei.12Andrei Parvu andrei.12 Data 6 martie 2008 21:06:05
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

#define lg 600

int n, m, r, c, i, j, s, sm, ds[lg], d[lg], a[lg][lg], sol[25], raspuns = -2000000000, rs[lg], ss;
void back1(int k){
	if (k == m + 1){
		int nrs = 0, sm = 0, sp;
		
		for (int i = 1; i <= m; i ++)
			if (sol[i]){
				nrs ++;
				sm += ds[i];
			}
		
		sp = ss - sm;
		
		if (nrs == c){
			for (int i = 1; i <= n; i ++){
				rs[i] = d[i];
				
				for (int j = 1; j <= m; j ++)
					if (sol[j])
						rs[i] -= a[i][j];
			}
			
			sort(rs+1, rs+n+1);
			
			for (int i = 1; i <= r; i ++)
				sp -= rs[i];
			
			if (sp > raspuns)
				raspuns = sp;
		}
		
		return ;
	}
	
	sol[k] = -1;
	while (sol[k] < 1){
		sol[k] ++;
		back1(k+1);
	}
}

void back2(int k){
	if (k == n + 1){
		int nrs = 0, sm = 0, sp;
		
		for (int i = 1; i <= n; i ++)
			if (sol[i]){
				nrs ++;
				sm += d[i];
			}
		
		sp = ss - sm;
		
		if (nrs == r){
			for (int i = 1; i <= m; i ++){
				rs[i] = ds[i];
				
				for (int j = 1; j <= n; j ++)
					if (sol[j])
						rs[i] -= a[j][i];
			}
			
			sort(rs+1, rs+m+1);
			
			for (int i = 1; i <= c; i ++)
				sp -= rs[i];
			
			if (sp > raspuns)
				raspuns = sp;
		}
		
		return ;
	}
	
	sol[k] = -1;
	while (sol[k] < 1){
		sol[k] ++;
		back2(k+1);
	}
}
int main()
{
	freopen("elimin.in", "rt", stdin);
	freopen("elimin.out", "wt", stdout);
	
	
	scanf("%d%d%d%d", &n, &m, &r, &c);
	for (i = 1; i <= n; i ++){
		s = 0;
		for (j = 1; j <= m; j ++){
			scanf("%d", &a[i][j]);
			
			s += a[i][j];
			ss += a[i][j];
		}
		d[i] = s;
	}
	
	for (j = 1; j <= m; j ++){
		s = 0;
		for (i = 1; i <= n; i ++)
			s += a[i][j];
		ds[j] = s;
	}
	
	if (m < n)
		back1(1);
	else
		back2(1);
	
	printf("%d\n", raspuns);
	
	return 0;
}