Cod sursa(job #16209)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 12 februarie 2007 16:41:56
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 31
#define MMAX 9666

using namespace std;

int A[NMAX][MMAX], B[MMAX][NMAX], N, M, R, C, S[MMAX], Ss[MMAX], Max;

int main()
{
        int i, j, k, sum, n, num;

        freopen("elimin.in", "r", stdin);
        scanf("%d %d %d %d", &N, &M, &R, &C);

        if (N < M)
        {
                for (i = 0; i < N; i++)
                    for (j = 0; j < M; j++) scanf("%d", &A[i][j]), Ss[j] += A[i][j];

                n = (1<<N);
                for (i = 0; i < n; i++)
                {
                        for (j = 0; j < M; j++) S[j] = Ss[j];
                        num = 0;
                        for (j = 0; j < N; j++)
                            if ( ((i>>j)&1) == 1 ) num++;
                        if (num == R)
                        {
                            for (j = 0; j < N; j++)
                                if ( ((i>>j)&1) == 1 )
                                    for (k = 0; k < M; k++)
                                        S[k] -= A[j][k];
                            sort(&S[0], &S[M]);
                            sum = 0;
                            for (k = C; k < M; k++) sum += S[k];
                            if (sum > Max) Max = sum;
                        }
                }
        }
        else
        {
                for (i = 0; i < N; i++)
                    for (j = 0; j < M; j++) scanf("%d", &B[i][j]), Ss[i] += B[i][j];

                n = (1<<M);
                for (i = 0; i < n; i++)
                {
                        for (j = 0; j < N; j++) S[j] = Ss[j];
                        num = 0;
                        for (j = 0; j < M; j++)
                            if ( ((i>>j)&1) == 1 ) num++;
                        if (num == C)
                        {
                            for (j = 0; j < M; j++)
                                if ( ((i>>j)&1) == 1 )
                                    for (k = 0; k < N; k++)
                                        S[k] -= B[k][j];
                            sort(&S[0], &S[N]);
                            sum = 0;
                            for (k = R; k < N; k++) sum += S[k];
                            if (sum > Max) Max = sum;
                        }
                }
        }

        freopen("elimin.out", "w", stdout);
        printf("%d\n", Max);

        return 0;
        
}