#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>
using namespace std;
#define REP(i,n) for((i)=0;(i)<(int)(n);(i)++)
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define eps 1.0E-12
int M,N;
double p[310][3010];
int len[310];
double q[310][3010];
double score[310][3010],dp[310][3010];
void update(int t, double prob){
int i;
double ignore_sum = 0.0;
for(i=len[t];i>=0;i--){
q[t][i+1] += q[t][i] * prob;
q[t][i] *= (1.0 - prob);
if(q[t][i] < 1.0E-50) q[t][i] = 0.0;
}
if(ignore_sum + q[t][len[t]+1] < eps){
ignore_sum += q[t][len[t]+1];
} else {
len[t]++;
}
}
int main(void){
int tmp,i,j,k;
freopen("MIDAU.INP","r",stdin);
freopen("MIDAU.OUT","w",stdout);
scanf("%d%d",&N,&M);
REP(i,N) REP(j,M){
scanf("%d",&tmp);
p[j][i] = tmp / 1000.0;
}
REP(i,M){
q[i][0] = 1.0;
REP(j,N) update(i,p[i][j]);
}
REP(i,M){
double expected = 0.0;
REP(j,len[i]+1) expected += q[i][j] * j;
score[i][len[i]] = expected;
double sumq = 0.0;
for(j=len[i]-1;j>=0;j--){
sumq += q[i][j+1];
score[i][j] = score[i][j+1] - sumq;
}
}
REP(i,M) REP(j,N+1) REP(k,len[i]+1) if(j+k <= N) dp[i+1][j+k] = max(dp[i+1][j+k], dp[i][j] + score[i][k]);
double ans = 0.0;
REP(i,N+1) ans = max(ans, dp[M][i]);
printf("%.12f\n",ans);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y3N0ZGlvPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgUkVQKGksbikgZm9yKChpKT0wOyhpKTwoaW50KShuKTsoaSkrKykKI2RlZmluZSBmb3JlYWNoKGMsaXRyKSBmb3IoX190eXBlb2YoKGMpLmJlZ2luKCkpIGl0cj0oYykuYmVnaW4oKTtpdHIhPShjKS5lbmQoKTtpdHIrKykKCgojZGVmaW5lIGVwcyAxLjBFLTEyCgppbnQgTSxOOwpkb3VibGUgcFszMTBdWzMwMTBdOwppbnQgbGVuWzMxMF07CmRvdWJsZSBxWzMxMF1bMzAxMF07CmRvdWJsZSBzY29yZVszMTBdWzMwMTBdLGRwWzMxMF1bMzAxMF07Cgp2b2lkIHVwZGF0ZShpbnQgdCwgZG91YmxlIHByb2IpewogICAgaW50IGk7CiAgICBkb3VibGUgaWdub3JlX3N1bSA9IDAuMDsKCiAgICBmb3IoaT1sZW5bdF07aT49MDtpLS0pewogICAgICAgIHFbdF1baSsxXSArPSBxW3RdW2ldICogcHJvYjsKICAgICAgICBxW3RdW2ldICo9ICgxLjAgLSBwcm9iKTsKICAgICAgICBpZihxW3RdW2ldIDwgMS4wRS01MCkgcVt0XVtpXSA9IDAuMDsKICAgIH0KCiAgICBpZihpZ25vcmVfc3VtICsgcVt0XVtsZW5bdF0rMV0gPCBlcHMpewogICAgICAgIGlnbm9yZV9zdW0gKz0gcVt0XVtsZW5bdF0rMV07CiAgICB9IGVsc2UgewogICAgICAgIGxlblt0XSsrOwogICAgfQp9CgppbnQgbWFpbih2b2lkKXsKICAgIGludCB0bXAsaSxqLGs7CiAgICBmcmVvcGVuKCJNSURBVS5JTlAiLCJyIixzdGRpbik7CiAgICBmcmVvcGVuKCJNSURBVS5PVVQiLCJ3IixzdGRvdXQpOwoKICAgIHNjYW5mKCIlZCVkIiwmTiwmTSk7CiAgICBSRVAoaSxOKSBSRVAoaixNKXsKICAgICAgICBzY2FuZigiJWQiLCZ0bXApOwogICAgICAgIHBbal1baV0gPSB0bXAgLyAxMDAwLjA7CiAgICB9CgogICAgUkVQKGksTSl7CiAgICAgICAgcVtpXVswXSA9IDEuMDsKICAgICAgICBSRVAoaixOKSB1cGRhdGUoaSxwW2ldW2pdKTsKICAgIH0KCiAgICBSRVAoaSxNKXsKICAgICAgICBkb3VibGUgZXhwZWN0ZWQgPSAwLjA7CiAgICAgICAgUkVQKGosbGVuW2ldKzEpIGV4cGVjdGVkICs9IHFbaV1bal0gKiBqOwogICAgICAgIHNjb3JlW2ldW2xlbltpXV0gPSBleHBlY3RlZDsKCiAgICAgICAgZG91YmxlIHN1bXEgPSAwLjA7CiAgICAgICAgZm9yKGo9bGVuW2ldLTE7aj49MDtqLS0pewogICAgICAgICAgICBzdW1xICs9IHFbaV1baisxXTsKICAgICAgICAgICAgc2NvcmVbaV1bal0gPSBzY29yZVtpXVtqKzFdIC0gc3VtcTsKICAgICAgICB9CiAgICB9CgogICAgUkVQKGksTSkgUkVQKGosTisxKSBSRVAoayxsZW5baV0rMSkgaWYoaitrIDw9IE4pIGRwW2krMV1baitrXSA9IG1heChkcFtpKzFdW2ora10sIGRwW2ldW2pdICsgc2NvcmVbaV1ba10pOwoKICAgIGRvdWJsZSBhbnMgPSAwLjA7CiAgICBSRVAoaSxOKzEpIGFucyA9IG1heChhbnMsIGRwW01dW2ldKTsKICAgIHByaW50ZigiJS4xMmZcbiIsYW5zKTsKCiAgICByZXR1cm4gMDsKfQo=