英文一大串,磨死人啊~~~
题目大致是想说:找到一个P位的二进制数和给的二进制数与,得到的n个二进制数是不同的,但是呢,这个p位的二进制数1的个数要最小就是了(自己的理解)
代码如下:
//#define LOCAL
#include "stdio.h"
#include "string.h"
int p[150];
int s[150][20];
int sf[150];
int differ(int *p,int m)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(p[i]==p[j])
return 0;
}
}
return 1;
}
int main()
{
#ifdef LOCAL
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
#endif
int t;
int n,m,count,min;
int i,j,k,v;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
count=0;
min=20;
memset(s,0,sizeof(s));
memset(sf,0,sizeof(sf));
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&s[i][j]);
}
}
for(j=0;j<m;j++)
{
for(k=0;k<n;k++)
{
sf[j]+=(s[j][k]<<(n-k-1));
}
}
for(i=1;i<(1<<n);i++)
{
count =0;
memset(p,0,sizeof(p));
for(j=0;j<m;j++)
{
p[j]=(i&sf[j]);
}
if(differ(p,m))
{
for(j=0;j<n;j++)
{
if((i>>j)&1)
count++;
}
if(count<min)
min=count;
}
}
printf("%d\n",min);
}
return 0;
}
其实可以省掉一个数组s的,将前面两个双for循环语句合并的^_^