Pagini recente » Cod sursa (job #2127727) | Cod sursa (job #1115542) | Cod sursa (job #1086399) | Cod sursa (job #2314807) | Cod sursa (job #567468)
Cod sursa(job #567468)
# 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], mk[40];
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 );
}*/
void back (){
int i, j, vf = (1 << n);
for (i = 1, mk[0] = 1; i <= n; ++i) mk[i] = (mk[i - 1] << 1);
for (i = 1; i <= vf; ++i){
L = 0;
for (j = n; j > 0; --j){
x[j] = (mk[j] & i) > 0;
L = L + x[j];
if (L > l || (l - L > j)) break ;
}
if (L == l) make ();
}
}
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;
}