#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#define N 1008
#define M 1000009
#define eps 0.00001
using namespace std;
int S,T,A[N],B[N],f[N][N],n,m,cnt=,tot,head[N],next[M],u[M],d[N],q[N];
double v[M],sum;
void jia1(int a1,int a2,double a3)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
v[cnt]=a3;
return;
}
void jia(int a1,int a2,double a3)
{
jia1(a1,a2,a3);
jia1(a2,a1,);
return;
}
bool bfs()
{
memset(d,,sizeof(d));
int h=,t=;
q[]=S;
d[S]=;
for(;h<t;)
{
h++;
int p=q[h];
for(int i=head[p];i;i=next[i])
if(!d[u[i]]&&v[i])
{
d[u[i]]=d[p]+;
if(d[T])
return ;
t++;
q[t]=u[i];
}
}
return ;
}
double dinic(int s,double f)
{
if(s==T)
return f;
double rest=f;
for(int i=head[s];i&&rest;i=next[i])
if(v[i]&&d[u[i]]==d[s]+)
{
double now=dinic(u[i],min(rest,v[i]));
if(!now)
d[u[i]]=;
v[i]-=now;
v[i^]+=now;
rest-=now;
}
return f-rest;
}
void jian(double mid)
{
cnt=;
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
jia(i+m,T,A[i]);
for(int i=;i<=m;i++)
jia(S,i,B[i]*mid);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
if(f[i][j])
jia(i,j+m,);
return;
}
int main()
{
scanf("%d%d",&n,&m);
S=;
T=n+m+;
for(int i=;i<=n;i++)
{
scanf("%d",&A[i]);
sum+=(double)A[i];
}
for(int i=;i<=m;i++)
scanf("%d",&B[i]);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&f[i][j]);
double l=,r=,qq;
for(;r-l>eps;)
{
double mid=(l+r)/2.0;
jian(mid);
double ans=;
for(;bfs();)
ans+=dinic(S,0x7fffffff);
if(ans>=(sum-eps))
{
qq=mid;
r=mid;
}
else
l=mid;
}
printf("%.6lf\n",qq);
return ;
}
二分答案网络流。