#include<iostream>
#include<cstdio>
using namespace std;
int t,n,m,a[101][101],k,ans;
int s1,s2,s;
void get()
{
int pc=min(k+1,m);ans=2e9;
for(int i=1;i<=pc;i++)
{
s=0;
for(int j=1;j<=m;j++)
{
s1=0;s2=0;
for(int o=1;o<=n;o++)
{
if(a[o][j]==a[o][i]) s1++;
else s2++;
}
s+=min(ans,min(s1,s2));
}
ans=min(ans,s);
}
}
void getw(int s)
{
int base=s;
for(int i=2;i<=n;i++)
{
s1=s2=0;
for(int j=1;j<=m;j++)
{
if(a[i][j]==a[1][j]) s1++;
else s2++;
}
base+=min(s1,s2);
}
ans=min(ans,base);
}
void gets(int x,int y)//这个函数非常巧妙,是这段代码最精彩的部分
{
if(x>m)
{
getw(y);
return;
}
gets(x+1,y);
a[1][x]=!a[1][x];
gets(x+1,y+1);
a[1][x]=!a[1][x];
}
int main()
{
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
// freopen("table.out","w",stdout);
cin>>t;
for(int w=1;w<=t;w++)
{
ans=2e9;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
if(k<m)
{
get();
}
else
{
ans=2e9;
gets(1,0);
}
if(ans>k) printf("-1\n");
else printf("%d\n",ans);
continue;
}
return 0;
}
(方法)枚举2^k所有情况
最新推荐文章于 2022-10-07 09:16:59 发布