Cod sursa(job #2235965)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 27 august 2018 15:00:44
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)
using namespace std;
int M, N, Table[1001][1001], R, C, i, j, Total, List[1001], Smax;
void Find(int Sum){
    int j;
    for(j=1; j<=N; j++)List[j]=Table[0][j];
    sort(List+1, List+N+1);
    for(j=1; j<=C; j++)Sum-=List[j];
    if(Sum>Smax)Smax=Sum;
    return;
}
void BKT(int i, int last, int S){
    if(i==R){Find(S); return;}
    int j, k;
    for(j=last+1; j<=M; j++){
        for(k=1; k<=N; k++)Table[0][k]-=Table[j][k];
        BKT(i+1, j, S-Table[j][0]);
        for(k=1; k<=N; k++)Table[0][k]+=Table[j][k];
    }
    return;
}
int main()
{
    freopen("elimin.in", "r", stdin);
    freopen("elimin.out", "w", stdout);
    scanf("%d%d%d%d", &M, &N, &R, &C);
    if(M<=N)
    for(i=1; i<=M; i++)
    for(j=1; j<=N; j++){
        scanf("%d", &Table[i][j]);
        Table[i][0]+=Table[i][j];
        Table[0][j]+=Table[i][j];
        Total+=Table[i][j];
    }
    else{
        for(i=1; i<=M; i++)
        for(j=1; j<=N; j++) {
                scanf("%d", &Table[j][i]);
                Table[j][0]+=Table[j][i];
                Table[0][i]+=Table[j][i];
                Total+=Table[j][i];
        }
        swap(M, N);
        swap(R, C);
    }
    BKT(0, 0, Total);
    printf("%d", Smax);
    return 0;
}