题目的编码方式codification 巧妙
#include<stdio.h>
#include<string.h>
int sym[110];
int numdup[(1<<15)+10]; //记录同一push(bismark)时 哪些数出现过
int p,n;
int min;
void minset(int sum)
{
int numones=0;
for(int i=0; i < p; i++)
{
if((1<<i)&sum) numones++;
}
if(numones >= min) return;
bool dup = false;
memset(numdup,0,sizeof(numdup));
for(int i = 0; i < n;i++)
{
if(numdup[sym[i]&sum])
{
dup = true;
break;
}
numdup[sym[i]&sum] = 1;
}
if(!dup)
min = numones;
}
int main()
{
//
freopen("input.txt","r",stdin);
int num;
scanf("%d",&num);
for(int i = 0; i < num;i++)
{
scanf("%d %d",&p,&n);
memset(sym,0,sizeof(sym));
int temp;
for(int j = 0; j < n;j++)
{
for(int m = 0; m < p;m++)
{
scanf("%d",&temp);
sym[j] = sym[j]*2+temp;
}
}
min = p;
int push;
for(push = 0; push < (1<<p); push++)
{
minset(push);
}
printf("%d\n",min);
}
}