总之,日前尚未掌握状压 dp 的时候
有了一个朴素的想法,将对每一位的询问结果做一次状压
211=2048 询问方式存在一个 int q 里,然后将每一个物体 ai & q=bi , 看 bi 有没重复,有重复就不能区分,没重复就可以猜到。
样例都过不了,有组数据比标答大 1 ,贴个代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
int n,m,x[136] = {0};
char s[16];
while(scanf("%d%d",&m,&n) == 2){
if(n == 0 && m == 0) break;
memset(x,0,sizeof(x));
for(int i = 1;i <= n;i++){
scanf("%s",s);
for(int j = 0;j < m;j++){
x[i] = x[i]*2 + s[j] - 48;
}
cerr << x[i] << " ";
}
/*if(n == 1){
printf("0\n");
continue;
}
if(n == 2){
printf("1\n");
continue;
}
//cerr << 233;*/
int C = 1 << m,ans = m;
for(int ii = 0;ii < C;ii++){
int f[C+1] = {0},cnt = 0;
for(int t = ii;t;t >>= 1)
cnt += t&1;
//cerr << cnt <<" ";
if(cnt > ans){cerr << "!"; continue;}
for(int i = 1;i <= n;i++){
int t = x[i] & ii;
f[t]++;
if(f[t] > 1){
cnt = 233;
break;
}
}2
if(ans > cnt)
ans = cnt;
}
printf("%d\n",ans);
cerr<<endl;
}
return 0;
}