UVA_11205
一开始在理解题意上面产生了严重的问题,后来看别人报告说是在给定的矩阵里面选出最少的列使得能区分每一行,还说实际上就是刘汝佳书上P120的子集生成问题。
后来大概过了一天我终于搞明白了“在给定的矩阵里面选出最少的列使得能区分每一行”是什么意思,之后就是枚举所有可能的列的组合,如果符合要求就更新表示最少列数的min即可。
#include<stdio.h>
#include<string.h>
int a[110][20],P,N,hash[100000],fac[20];
int main()
{
int i,j,k,t,min,sum,num,ok;
fac[0]=1;
for(i=1;i<20;i++)
fac[i]=2*fac[i-1];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&P,&N);
for(i=0;i<N;i++)
for(j=0;j<P;j++)
scanf("%d",&a[i][j]);
min=1000000000;
for(i=0;i<(1<<P);i++)
{
memset(hash,0,sizeof(hash));
num=0;
for(k=0;k<P;k++)
if(i&(1<<k))
num++;
ok=1;
for(j=0;j<N;j++)
{
sum=0;
for(k=0;k<P;k++)
if(i&(1<<k))
sum+=fac[k]*a[j][k];
if(hash[sum]==0)
hash[sum]=1;
else
{
ok=0;
break;
}
}
if(ok&&num<min)
min=num;
}
printf("%d\n",min);
}
return 0;
}