提交时间:2024-05-08 13:58:05
运行 ID: 29435
#include<bits/stdc++.h> using namespace std; #define int long long #define double long double #define pii pair<int,int> #define fr first #define sc second #define mk make_pair const int MAXN=310,N=310,inf=1000000000,Mod=1000000007; int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x*=10;x+=c-'0';c=getchar();}return x*f;} int n,m,p[N][MAXN],us[N][MAXN],nm[MAXN]; pii a[MAXN*N]; bool p50; double ans,as; bool fd[MAXN]; void check(int now,double g,int q){ if(now==n*m+1){ as+=g*q; return; } if(fd[a[now].sc]){ check(now+1,g,q); return; } fd[a[now].sc]=1; check(now+1,1.0*(100-p[a[now].fr][a[now].sc])/100*g,q+1); fd[a[now].sc]=0; nm[a[now].sc]++; if(nm[a[now].sc]==n){ as+=1.0*p[a[now].fr][a[now].sc]/100*g*(q+1); nm[a[now].sc]--; return; } check(now+1,1.0*p[a[now].fr][a[now].sc]/100*g,q+1); nm[a[now].sc]--; } void dfs(int now){ if(now==n*m+1){ as=0; check(1,1,0); ans=min(ans,as); return; } for(int j=1;j<=m;j++){ for(int i=1;i<=n;i++){ if(!us[i][j]){ a[now]=mk(i,j);us[i][j]=1; dfs(now+1); us[i][j]=0; } } } } double f[MAXN][MAXN*N];double p2[MAXN*N]; void slv(){ ans=inf; n=read(),m=read(); p50=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ p[i][j]=read(); if(p[i][j]!=50)p50=0; } } if(p50){ p2[0]=1; for(int i=1;i<=n*m;i++)p2[i]=p2[i-1]/2; for(int i=1;i<=n*m;i++)p2[i]*=i; f[0][0]=1;ans=0; for(int j=1;j<=m;j++){ for(int i=1;i<=n;i++){ for(int o=n*m;o>=i;o--){ f[j][o]+=f[j-1][o-i]; } } } for(int i=1;i<=m;i++){ for(int j=i-1;j<=(i-1)*n;j++){ ans+=f[i-1][j]*p2[j+n]; } } for(int i=1;i<=n*m;i++){ ans+=p2[i]*f[m][i]; } printf("%.5Lf",ans); } else{ dfs(1); printf("%.5Lf",ans); } } signed main(){ slv(); return 0; }